Mysql索引

索引是帮助mysql高效获取数据的排好序的数据结构。mysql索引用的是B+树。

通俗点说,数据库索引好比一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。索引的存储原理大概可以概括为一句话:以空间换时间

单索引

 二叉树、红黑树等动画演示网址:Data Structure Visualization (usfca.edu)

二叉树如果查006索引,需要查6次

红黑树如果查006索引,要查4次

如果索引非常多呢?二叉树、红黑树都会有弊端,树的高度不会压的很低,查询还是会消耗较多的I/O。

 hash也存在一定缺陷,比如不支持范围查找,可能会有hash冲突。

MyISAM存储:MYI存放索引,MYD存放真实数据。

非聚集索引代表着索引和数据放在不同的文件里。

上面代码的执行,首先判断t.col1是否有索引,有索引的话去到索引文件MYI里快速找到30的磁盘所在地址0xF3,然后根据地址去到MYD文件定位数据。

 innodb存储,idb存放了索引和数据,属于聚集索引。

根据主键索引找到位置,叶子节点包含了完整的数据记录。而普通索引的话,叶子节点存放的是主键索引,会进行回表,再找到主键索引的位置,查询完整数据记录。

联合索引的底层存储长什么样?

默认按第一个字段(name)大小排序,如果第一个字段相同再按照第二个排序,然后依次。

最左前缀原则:查询从索引的最左前列开始并且不跳过索引中的列。所以上面的代码只有红框的走了索引。如果先age=30进行查找,可能会变成全表扫描。

 ​​​​​​mysql为什么选择B+树不选择B树?

 首先分析B+树

由于非叶子节点不存储data,除了叶子节点,一个索引占8B,指针占6B,一个节点16KB,第一层可以存1170个索引。第二层的每个节点也能放1170个索引,叶子节点一个索引占1KB则一个节点存16个索引。所以当n=3时可以存放的索引数为1170*1170*16=21902400。

但是B树

 假设放入2千万个索引,每个节点16kb,一个索引1kb,一个节点可放16个。那么16^{n}=20000000,n的结果肯定大于3(算了一下是6.0634),树的高度必然高于B+树,那么找叶子节点必然经历更多次查找。

该文只对自己想了解的部分做了记录与总结,更多知识点参考(81条消息) 一文搞懂MySQL索引所有知识点(建议收藏)_敖 丙的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值