MySQL索引底层原理

1,MySQL索引的底层实现是B+Trees,根节点存在内存中;

为什么不是二叉树或者红黑树,二叉树对于连续递增列没有效果,红黑树,数据量比较大的时候节点数比较多,查询效率也是比较低的

B+Trees:同一节点扩大索引的数量,但不存储数据,所有的数据都存储在叶子结点;

2,每个节点的大小大约16K,具体:16384;每个索引(bigint)占8bit,后面紧跟一个指针占6bit,总共14bit,所以根节点可以存储16k/14bit大约为1170个索引,如果为三层结构,就可以存储2千万(1170x1170x16(16k/1k每条数据占1k)=2千多万)条数据,三次IO就可以轻松解决千万级别的数据查找;

查询SQL:show global status like “Innodb_page_size”;

3,MySQL底层索引算法支持B+Trees和hash两种方式

Hash的效率比B树高,为什么不用hash,因为hash不支持范围查找,只适用于=,如<,>hash就没用了,所以大部分情况下都是用B树而不用hash;

B树叶子之间有维护指针,适用于范围查找。

 

4,Myisam和Innodb的底层区别:

Myisam叶子结点存储的是索引和数据地址,具体数据在另外一个文件;

Innodb叶子结点存储的是索引和具体的行数据,索引和数据在同一个文件;

从这个层面看,innodb比myisam少了一次数据的查找,效率要高;

聚集索引:叶子结点包含了完整的数据记录

非聚集索引:索引文件和数据是分开存储的

问题1:为什么Innodb必须有主键,并且建议为整型?

          因为innodb要求必须有主键来维护btree的数据结构,即使我们不建,默认也会自动建一个,我们看不到而已,至于要用整型,是因为,在btree比较大小的时候整型效率比较高,并且占用的空间也比较小,至于自增,不是自增会导致节点分裂,数据存储调整,效率很低,如果是自增,数据只是往后面加,效率就非常高

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值