Mysql大表如何优化?

本文阅读 5 分钟
首页 知识库 正文

当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:

  1. 限定数据的范围
    务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们
    可以控制在一个月的范围内;
  2. 读/写分离
    经典的数据库拆分方案,主库负责写,从库负责读;
  3. 垂直分区
    根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信
    息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。
    简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示,这样来
    说大家应该就更容易理解了。
    1583307481617
    垂直拆分的优点: 可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,
    垂直分区可以简化表的结构,易于维护。
    垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层
    进行Join来解决。此外,垂直分区会让事务变得更加复杂;
  4. 水平分区
    保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达
    到了分布式的目的。 水平拆分可以支撑非常大的数据量。
    水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据
    拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单
    一表数据量过大对性能造成影响。
    水平拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问
    题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平
    拆分最好分库 。
    水平拆分能够 支持非常大的数据量存储,应用端改造也少,但 分片事务难以解决 ,跨节点Join性能
    较差,逻辑复杂。《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片,因为拆分会带来
    逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有
    太大问题的。如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。
    下面补充一下数据库分片的两种常见方案:
    客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网
    的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
    中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现
    在谈的 Mycat 、360的Atlas、网易的DDB等等都是这种架构的实现。
    详细内容可以参考: MySQL大表优化方案: https://segmentfault.com/a/1190000006158186
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

事务隔离级别有哪些?MySQL的默认隔离级别是?
« 上一篇 08-26
分库分表之后,id 主键如何处理?
下一篇 » 08-26

发表评论

惪特博客
  • 文章总数:
    18355 篇
  • 评论总数:
    52548 条
  • 标签总数:
    8664 个
  • 总浏览量:
    16139936 次
  • 最后更新:
    昨天 16:34

最多点赞

随便看看

标签TAG