MySQL什么时候需要进行分表
博客书写不易,转载请注明出处!
前提:mysql使用InnoDB事务型引擎,由于使用InnoDB那么默认的索引树则为B+数
先给结论:当数据到达千万时可以考虑分表了
===============================感兴趣可以看以下计算方式===============================
B+数知识点:
- B+树非叶子节点只存储索引
- B+树每层的索引有重复
- B+树叶子节点(也就是最后一个节点)才有数据
- B+树叶子节点指针是双向的
共识:树的层级越高,查询速度越慢,索引占据内存越大
为了保障数据的高效查询,减少B+数的查询层数,这里规定B+数只有三层为高效
前置条件:
- 这里约束B+数只有三层为高效查询,大于三层不做考虑
Q:那么三层的B+数能存放多少数据,表数据达到多少后需要进行优化?
基础知识点:
- innoDB最小单位为页,一页为16K
- 主键一般为bigint 8字节,指针大小在InnoDB是6字节
- B+数最后一层包含数据
B+数模型如下:
由上面基础信息和图可以得出三层数据量
- 每页能存放(主键+指针)的数量:16*1024/(8+6)=1170
- 第一层:能存放 1170 个
- 第二层:能存放 1170 * 1170 个
- 第三层:由于限制只有三层,B+数最后一层包含数据,设每条数据为1KB,那么第三层的数据数量为:1170*1170*16/1=21902400 所以当数据到达千万时可以考虑分表了,否则树高超过三层,会导致查询效率变差