为什么建议MySQL在2000W条左右记录分表?这个数量问题并不是绝对的,这是一个相对的数量。在回答这个问题前我们应该先了解MySQL底层是用的什么数据结构来进行数据存储的。
MySQL底层采用的B+树进行的数据存储
InnoDB存储引擎最小储存单元是页,一页大小就是16k。B+树叶子存的是数据,内部节点存的是键值+指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而再去数据页中找到需要的数据.
我们假设主键ID为bigint类型,长度为8字节(int类型,一个int就是32位,4字节),而指针大小在InnoDB源码中设置为6字节,所以就是 8+6=14 字节,16k/14B =161024B/14B = 1170,2层的话既能代表11701170个地址。
我们如果一行记录的数据大小为1k,那么单个叶子节点可以存的记录数 = 16k/1k =16,所以3层的B+树存储的记录在1170117016 = 21902400,大概2千万条记录。
为什么不用4层B+树?
使用4层B+树需要磁盘IO次数增加,数据多了但是影响力了性能,这也是建议数据记录过千万条分表的原因。
这只是个理论的数值,叶子节点的数据量大小不同,3层B+数能存储的条数也不同。那么假如一条数据记录的大小不是1kb呢?还是建议,最多存满3层B+树不是1kb,会让3层B+树的最大数据记录数量发生变化比如一条数据记录5kb 那么一个数据页只能存16kb/5kb≈3条记录。此时3层B+树的最大记录数量为
total=311701170=4,106,700条,410w条记录,远小于2000w条也就是说对于复杂数据记录的单表,建议的最大存储记录要小于甚至远小于2000w条.