经常听到MySQL单表最多能存放2千万数据,多了就要考虑分表,依据是什么呢?
Innodb数据页大小
索引与数据存放在一个文件中。本文以MySQL为例,Innodb默认数据页大小是16KB。
查询语句innodb_page_size
show global variables like "innodb_page_size";

索引内容结构
结构图
MySQL索引的数据结构:B+树
-
非叶子节点不存储data,只存储索引(几余),可以放更多的索引
-
叶子节点包含所有索引字段
-
叶子节点用指针连接,提高区间访问的性能
非叶子节点
主键+页号
假如:
主键是bigint,8bit;页号是4bit,一共12bit。一页总数:15K%12bit=1280条。
再假如每行数据大小为1Kb,每个叶子节点能存放数据就是15K%1K=15条。
一层的B+树存放数据是15
二层的B+树存放数据是1280*15
三层的B+树存放数据是1280*1280*15=2400万
因为考虑到磁盘IO性能问题,当超过3次时性能会急剧下降。如果每行数据只有250bit,单页数据可存放60条,三层B+树可存放接近1亿了,访问速度一样不会慢。
MyISAM索引引擎
文件和数据文件是分离的(非聚集)
Hash索引
-
对索引的key进行一次hash计算就可以定位出数据存储的位置
-
很多时候Hash索引要比B+ 树索引更
-
高效仅能满足“=N',但不支持范围查询
-
hash冲突问题

文章讨论了MySQL中Innodb存储引擎的单表容量限制,基于数据页大小和B+树索引结构的理论,解释了为什么超过2千万数据可能需要考虑分表。同时对比了MyISAM和Hash索引的特点,强调了磁盘IO性能在决定数据库性能中的重要性。

366

被折叠的 条评论
为什么被折叠?



