mysql海量数据优化性能方案


产生瓶颈的原因一般有三:

1.mysql连接数过多

2.单表数据量多大(数据量大会导致索引所占硬盘空间多大,因为索引查找使用的是B+树,需要把索引加载从硬盘加载进内存,这就是瓶颈最大原因)

mysql在从库上设置主库信息 mysql从库数据比主库多_字段


3.硬件资源

常见的优化方案

读写分离、分库分表(表分区是它子集)、缓存、索引、sql优化
海量数据的主要解决方式常见还是读写分离、分库分表

mysql在从库上设置主库信息 mysql从库数据比主库多_表数据_02


优点:解决连接数、硬件资源问题。缺陷:需要考虑主从库延时的问题

mysql在从库上设置主库信息 mysql从库数据比主库多_字段_03

分库分表

垂直拆分:
1.根据业务场景把一个库的表拆分到好几个库,例如用户库、订单库、商品库等等。(优点:业务明晰。缺点:关联查询可能要支持分布式)
2.把一个多字段的大表按常用字段和非常用字段进行拆分,大表变小表。
优点:
1.可以使得数据变小,一个数据块(block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block就少)

  1. 可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起

缺点:

  1. 主键出现冗余,需要管理冗余例
  2. 会引起表连接JOIN操作(增加CPU开销)可以通过在业务服务器上进行join来减少数据库压力
  3. 依然存在单表数据量过大的问题(需要水平拆分)

水平拆分(更重要):
1.把表数据过多的数据分片分离,按时间、按哈希取mod分离,枚举分离等
实际情况中往往会是垂直拆分和水平拆分的结合
水平拆分的优点是:
2.不存在单库大数据和高并发的性能瓶颈
应用端改造较少

缺点是:
1.分片事务一致性难以解决
2.跨节点Join性能差,逻辑复杂(mycat设置合理,可以优化该问题)
3.数据多次扩展难度跟维护量极大

Mycat设置表分片

mysql在从库上设置主库信息 mysql从库数据比主库多_表数据_04


我们目的是使用中间件mycat,给表设置分片,配置mysql主从复制分离读写,做一个演示例子。

左边绿色是逻辑库,右边才是目标想要得到的结果。

逻辑表的概念:

分片表指用户表

E-R表:假设用户跟用户地址是一对多关系,ER表指用户地址表,数据跟随用户的关联关系

全局表指数据字典表,适合那种不多变,但在各个业务都有使用的表。

mysql在从库上设置主库信息 mysql从库数据比主库多_数据_05