索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。
最常见的索引是Btree索引和Hash索引。
不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。
既然聊到了B+树,那就不得不提一下B树了。
B树是一棵多路自平衡搜索树,它类似于普通的二叉树,但是它允许每个节点有更多的子节点。
B树的特点:
- 所有的键值分布在整棵树中(区别于B+树)
- 任何关键字出现且只能出现在一个节点
- 搜索有可能在非叶子节点完成
- 在关键字全集内做一次查找,性能逼近二分查找

B+树是一种B树的变体,也是一种多路自平衡搜索树,示意图如下:

- B+树的非叶子节点不存储真正的data
- 为所有的叶子节点增加了一个链指针
- MySISM中的data存储的是物理地址,由物理地址找到数据;而Innodb中的data存储的是数据
那么为什么Mysql使用的是B+树而不是B树呢?
- B+树更加适合磁盘存储,由于它的非叶子节点不存储数据,所以每一个节点都可以存储更多的非叶子节点,这样每个节点能索引的范围就更大更准确。也就是说使用B+树单次IO得到的信息量更大,IO的效率更高。
- Mysql是关系型数据库,经常会按照某个区间来访问索引列。B+树在叶子节点间按顺序建立了链指针(双向链表),加强了区间访问性。所以B+树对索引列上的区间访问很友好,而B树每个节点的key和data在一起,无法进行区间访问。
顺便再来提提Hash索引
Hash索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎会给所有索引列计算一个哈希码,哈希码是一个比较小的值,并且不同键计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
Memory支持hash索引
优点:检索效率很高
缺点:1. 无法被用来避免数据的排序操作
- 仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。
- 遇到大量hash冲突时会消耗性能
- 不能利用部分索引键查询,因为哈希索引是根据全部索引列计算的哈希码。
好了,以上就是我对于Mysql索引的一些理解,本人才疏学浅,如有不对,还望批评指正。
网友评论