zoukankan      html  css  js  c++  java
  • mysql5.7一颗B+树可以存放多少行数据?为什么使用B+树而不是B树?

    一颗B+树的层高最好控制在3层之内,到第4层性能会急剧下降。

    计算机存储数据时,一个扇区512KB,一个文件是4KB,innodb存储一页是16KB,innodb的所有文件大小一定是16KB的整数倍,一定是16384 byte的整倍数。

    一个叶子节点有多少字节可以存放指向下一节点的指针,取决于主键的类型,比如bigint是8字节,而指针又占用6字节,所以指针可以指向1170个非叶子节点: 

    16384 / (8+6)= 1170 个非叶子节点

    同理,指向叶子节点的个数也可以是1170个,那么3层高的一颗B+树可以存储:

    第一层指向1170个非叶子节点,第二层再指向1170个叶子节点,1170 * 1170 = 1368900 个叶子节点

    那么假设一条记录1KB大小,那么一页16KB就可以存储16行,那么 16行 * 1368900 个叶子节点 = 21902400 行。

    【结论】

    在每行数据是1KB的情况下,3层高的B+数可以存放2190万多条数据。

    【为什么mysql使用B+树?而不是B树?】

    因为B树的非叶子节点也存储数据,而B+树只有在叶子节点才存储数据,所以B树因为存放了数据,所以能放指针的地方就变少了,那要保存同样多的数据,就一定要增加树的高度,如果运气好,那么可能在中间的叶子节点就能找到,如果运气不好,那么需要找很多节点才能找到,这个性能是不稳定的。

    【HashMap适合做数据库索引吗?】

    1、数据量很大的时候hash冲突也很大

    2、不支持排序

    3、不支持range范围取值

    【密集索引和稀疏索引】

    如果这个索引树上不仅有指定的索引列的值,还有其他列的值,那么就是密集索引,比如主键索引。

    只保存了构成了索引的列,比如组合索引a,b,c,那么该索引树只包含了a,b,c三个列的值,没有保存其他更多列的值,就是稀疏索引,那么所有二级索引都是稀疏索引。

    【mysql合并sql语句】

    insert into t1 values(...),(...),(...); 合并了sql语句

    end.

    支付宝扫一扫,为女程序员打赏!
    作者:梦幻朵颜
    版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    SQL Server 2008 数据库回滚到某个时间点
    SQL Server 2008以上误操作数据库恢复方法——日志尾部备份
    C# BindingSource
    何谓SQL Server参数嗅探
    mongodb获取具体某一天的查询语句
    给MongoDB添加索引
    MongoDB 学习笔记四 C#调用MongoDB
    Access MongoDB Data with Entity Framework 6
    Ruby 和 OpenSSL CA 证书的问题
    解决方法:配置群集时# gem install redis 报错:Unable to require openssl, install OpenSSL and rebuild ruby
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/15072518.html
Copyright © 2011-2022 走看看