
二、索引相关
.1. 什么是索引?索引是一种数据结构,可以帮助我们快速的进行数据的查找.2.
索引是个什么样的数据结构呢?索引的数据结构和具体存储引擎的实现有关, 在
MySQL 中使用较多的索引有 Hash 索引,B+树索引等,而我们经常使用的 InnoDB 存
储引擎的默认索引实现为:B+树索引.3. Hash 索引和 B+树所有有什么区别或者说
优劣呢?首先要知道 Hash 索引和 B+树索引的底层实现原理:hash 索引底层就是
hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回
表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是
从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需
要回表查询数据.那么可以看出他们有以下的不同:
� hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查
询.
因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持
一致,不能支持范围查询.而 B+树的的所有节点皆遵循(左节点小于父节点,右节
点大于父节点,多叉树也类似),天然支持范围.
� hash 索引不支持使用索引进行排序,原理同上.
� hash 索引不支持模糊查询以及多列索引的最左前缀匹配.原理也
是因为 hash 函数的不可预测.AAAA 和 AAAAB 的索引没有相关性.
� hash 索引任何时候都避免不了回表查询数据,而 B+树在符合某些
条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询.
� hash 索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某
个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差.而 B+树
的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的
高度较低.
因此,在大多数情况下,直接选择 B+树索引可以获得稳定且较好的查询速度.而
不需要使用 hash 索引.4. 上面提到了 B+树在满足聚簇索引和覆盖索引的时候不
需要回表查询数据,什么是聚簇索引?在 B+树的索引中,叶子节点可能存储了当前
的 key 值,也可能存储了当前的 key 值以及整行的数据,这就是聚簇索引和非聚簇
索引. 在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键
建立聚簇索引.如果没有唯一键,则隐式的生成一个键来建立聚簇索引.当查询使
用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表