mysql使用innodb的B+树存储表项,保存在.ibd文件中,其中叶子节点页存储数据页,非叶子节点页存储索引页
.ibd文件的一页大小16kb,其中有15kb存记录。
假设每页的记录都存满一页:
1.非叶子节点存索引记录,一条记录4字节主键8字节页号共12字节,一页能存15*1024/12=1280条记录,所以B+树是1280叉树
2.叶子节点存数据记录,假设一条记录1kb,一页能存15/1=15条记录
3.假设存满2层的B+树:

综合1、2、3,此时,能存的最大记录数量为
total=15*1280^(2-1)=19200条记录
如果存满3层B+树,total约=2450w条记录
刚好约等于2000w条

接下来咱看看,存满2层b+树,把所有索引页加载到内存,要占多少内存:
1280*16kb=20480kb

如果内存要完全存3层B+树的索引表需要
1280*1280*16kb=26214400kb的内存

如果内存要完全存4层B+树的索引表需要
1280*1280*1280*16kb=33554432000kb的内存
可以发现,3层B+树,数据库缓冲区就基本不够了,必须要进行磁盘io
而这个磁盘io时间就是增加单标查询时间的罪魁祸首

再思考,假如一条数据记录的大小不是1kb呢?
也是只建议,最多存满3层B+树
不是1kb,会让3层B+树的最大数据记录数量发生变化
比如一条数据记录5kb 那么一个数据页只能存15kb/5kb=3条记录
此时3层B+树的最大记录数量为
total=3*1280^(3-1)=4915200条
也就是说
对于复杂数据记录的单表,建议的最大存储记录要小于甚至远小于2000w条,当然具体合理的值是多少,要具体计算

原文地址:http://www.cnblogs.com/lovecodingforever/p/16847310.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性