InnoDB 单表数据量超过 2000W 出现性能问题
MySQL InnoDB 缓冲池中页的大小默认是 16K 在操作系统的文件管理系统中进行一次 io 读写,默认读取的大小为 4kb(一页)。又因为局部性原理,操作系统会将命中的页周围的三块页一同加载进 Innodb 的缓存池中,因此 Innnodb 缓存池中页的大小为 16kb。
通常
主键使用 bigint 大小为 8 字节
指针 大小为 4 字节
B + 树中一个数据页的节点数为 16 * 1024 / (8 + 4) = 1170
在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间
生产系统,能够接受的一般为 3 层,超过后 SQL 就比较慢了
一般情况,单条数据为 1K 左右,树高为 2 时,存储的数据量:1170 * (16 / 1)= 18720
树高为 3 时,存储的数据量:1170 * 1170 * (16 / 1)= 21902400
注:上述数据基于一般统计计算,实际情况随着主键类型、单行数据大小等的不同,都会有所变化
版权声明: 本文为 InfoQ 作者【红袖添香】的原创文章。
原文链接:【http://xie.infoq.cn/article/c668a7e73e3a02f7a854c7fd7】。文章转载请联系作者。
评论