MySQL 对于千万级的大表要怎么优化?( 二 )


分表我们前面有提到过对于mysql,其数据文件是以文件形式存储在磁盘上的 。当一个数据文件过大时,操作系统对大文件的操作就会比较麻烦耗时,且有的操作系统就不支持大文件,这个时候就必须分表了 。另外对于mysql常用的存储引擎是Innodb,它的底层数据结构是B+树 。当其数据文件过大的时候,查询一个节点可能会查询很多层次,而这必定会导致多次IO操作进行装载进内存,肯定会耗时的 。除此之外还有Innodb对于B+树的锁机制 。对每个节点进行加锁,那么当更改表结构的时候,这时候就会树进行加锁,当表文件大的时候,这可以认为是不可实现的 。所以综上我们就必须进行分表与分库的操作 。
如何进行分库分表,目前互联网上有许多的版本,比较知名的一些方案:阿里的TDDL,DRDS和cobar,京东金融的sharding-jdbc;民间组织的MyCAT;360的Atlas;美团的zebra;其他比如网易,58,京东等公司都有自研的中间件 。
这么多的分库分表中间件方案归总起来,就两类:client模式和proxy模式 。

MySQL 对于千万级的大表要怎么优化?

文章插图
 
client模式
MySQL 对于千万级的大表要怎么优化?

文章插图
 
proxy模式无论是client模式,还是proxy模式 。几个核心的步骤是一样的:SQL解析,重写,路由,执行,结果归并 。个人比较倾向于采用client模式,它架构简单,性能损耗也比较小,运维成本低 。
如何对业务类型进行分库分表 。分库分表最重要的一步,即sharding column的选取,sharding column选择的好坏将直接决定整个分库分表方案最终是否成功 。而sharding column的选取跟业务强相关 。在我们的项目场景中,sharding column无疑最好的选择是业务编号 。通过业务编号,将客户不同的绑定签约业务保存到不同的表里面去,根据业务编号路由到相应的表中进行查询,达到进一步优化sql的目的 。
 




推荐阅读