Mysql索引的数据结构
1. 索引的作用以及优缺点
索引是帮助myqsl高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
优点:提高数据检索的效率,降低数据库IO的成本;当排序时使用索引进行,可以降低对手数据排序时CPU的消耗
缺点:索引的存储也需要占用空间;导致表数据的insert和update效率降低
2. 索引的数据结构及对比
Mysql的索引是在存储引擎层实现的,不同的引擎有不同的结构常用的索引的结构有
B+树索引:大部分存储引擎都支持该结构的索引
**哈希索引:**底层的数据结构是用哈希表实现的,只有精确匹配索引列的额查询才有效,不支持范围查询。
B+树索引 优点
- 非叶子节点上可以存储更多的键值,相应的树的阶数会更大,因此树的深度会更小,在查找数据时进行报备磁盘IO的次数会减少,因此查询更快。
- 所有数据记录都有序存储在叶子节点上,就会使得范围查找,排序查找,分组查找以及去重查找变得简单。
- 数据页之间、数据记录之间都是通过链表连接的,可以更方便的在数据查询后进行升序或者是降序操作。
相对B树来说,B+树的所有节点都存放在叶子节点中,并且形成一个单向链表。
Mysql对经典的B+树进行了优化,增加了一个向相邻节点的叶子指针,形成了带有顺序指针的B+ 树,提高区间访问的性能。
哈希索引
采用一定的哈希算法,将键值映射成一定的哈希值,映射到对应的槽位上,存放在哈希表中,如果多个键值对映射到同一槽位上,就产生了哈希碰撞,可以用链表来解决该问题。
-
哈希索引只能进行对等比较,不支持范围查询
-
无法利用索引完成排序操作
-
组合hash索引不能利用部分索引键进行查询。
-
Hash索引需要回表扫描
-
查询效率高,通常只需要一次检索即可,效率通常高于B+ 树索引,但是当遇到大量Hash值相等的情况后性能不一定比B+树高
在MySQL中,支持哈希索引的是Memory引擎。
InnoDB和Myisam存储引擎也支持哈希索引,但是需要通过伪哈希索引来实现,叫自适应hash索引。