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 所以当数据到达千万时可以考虑分表了,否则树高超过三层,会导致查询效率变差

 

posted @ 2022-01-13 16:52  SugarWater  阅读(626)  评论(0编辑  收藏  举报