MySQL中多大的表是大表?
我们通常说表太大,另外一层意思就是数据太多了,导致索引的效果都不明显了,只能分表了。所以我们在讨论什么是大表时,需要站在Mysql索引角度来分析,到底多大数据量时是大表。
上图是Innodb中的一个主键索引,也就是一颗B+树,树中的每个节点是一个Innodb Page,大小默认为16kb,叶子节点中的每个节点主要存储的就是一条条数据,非叶子节点中存储的是主键和页地址。
所以,我们可以来计算一下,如果B+树的高度为2,能存多少条数据。
- 假如一条记录为1kb
- 主键类型为int类型,也就一个主键占4b
- innodb中一个页地址需要占6b
所以1页中,也就是一个节点中,可以存:
- 16kb/1kb = 16条行数据
- 16kb/(4b+6b) = 1638条索引记录(主键+索引地址)
所以如果B+树的高度为2,那么叶子节点就有1638个,所以能存的行数据条数为:1638*16 = 26208条记录。
如果B+树的高度为3,那么第一层一个节点,第二层1638个节点,第三层1638*1638个节点,最终数据条数为:1638*1638*16=42,928704
也就是差不多4000多万条数据。
如果主键的类型为bigint,一个主键占8个字节,所以高度为3时,能存:
- 16kb/(8b+6b) = 1170
- 1170*1170*16= 21902400
也就是2000多万行数据。
所以,我们可以通过这种方式来判断一个表的数据量是不是过多(B+树的高度一般不建议超过三层,因为B+树的数据都是存在磁盘中的,树太高了,进行IO的次数就表多了,整体效率也就降低了),大家后续可以通过我介绍的方法来计算某一个表,B+树高度为2时能存多少条记录,高度为3时能存多少记录,如果表中实际的数据总条数超过了3层能存放的数据量,那么这个表就是大表了,此时索引的效率就不高了,就需要进行分表了。