金三银四精选java面试题-Mysql中多大的表是大表?

发布时间:2023-12-19 15:04:28
 

MySQL中多大的表是大表?

 

 

我们通常说表太大,另外一层意思就是数据太多了,导致索引的效果都不明显了,只能分表了。所以我们在讨论什么是大表时,需要站在Mysql索引角度来分析,到底多大数据量时是大表。

 

 

上图是Innodb中的一个主键索引,也就是一颗B+树,树中的每个节点是一个Innodb Page,大小默认为16kb,叶子节点中的每个节点主要存储的就是一条条数据,非叶子节点中存储的是主键和页地址。

 

所以,我们可以来计算一下,如果B+树的高度为2,能存多少条数据。

 

  • 假如一条记录为1kb
  • 主键类型为int类型,也就一个主键占4b
  • innodb中一个页地址需要占6b

 

所以1页中,也就是一个节点中,可以存:

  1. 16kb/1kb = 16条行数据
  2. 16kb/(4b+6b) = 1638条索引记录(主键+索引地址)

 

所以如果B+树的高度为2,那么叶子节点就有1638个,所以能存的行数据条数为:1638*16 = 26208条记录。

 

如果B+树的高度为3,那么第一层一个节点,第二层1638个节点,第三层1638*1638个节点,最终数据条数为:1638*1638*16=42,928704

 

也就是差不多4000多万条数据。

 

如果主键的类型为bigint,一个主键占8个字节,所以高度为3时,能存:

  1. 16kb/(8b+6b) = 1170
  2. 1170*1170*16= 21902400

也就是2000多万行数据。

 

所以,我们可以通过这种方式来判断一个表的数据量是不是过多(B+树的高度一般不建议超过三层,因为B+树的数据都是存在磁盘中的,树太高了,进行IO的次数就表多了,整体效率也就降低了),大家后续可以通过我介绍的方法来计算某一个表,B+树高度为2时能存多少条记录,高度为3时能存多少记录,如果表中实际的数据总条数超过了3层能存放的数据量,那么这个表就是大表了,此时索引的效率就不高了,就需要进行分表了。

 

 


 
上一篇 金三银四精选java面试题-Mysql慢查询该如何优化?
下一篇 金三银四精选java面试题-count(*)与count(1)有什么区别

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题