索引定义
索引是帮助MySQL高效获取数据的排好序的数据结构。
索引数据结构
二叉树
每个节点有两个子节点,数据量的增大必然导致高度的快速增加,对那种逐渐增大的数据查询相当于链表查询,效率低下,显然这个不适合作为大量数据存储的基础结构。
红黑树
红黑树相对于平衡二叉树,对那种逐渐增大的数据查询会进行平衡,比二叉树快一点,但是树的高度会很高,如果要查询叶子节点,会很慢。
Hash
对索引的key进行一次hash计算就可以定位出数据存储的位置,很多时候Hash索引要比B+ 树索引更高效仅能满足 “=”,“IN”,不支持范围查询,但会有hash冲突问题。
B树
叶节点具有相同的深度,叶节点的指针为空 所有索引元素不重复 ,节点中的数据索引从左到右递增排列,一块空间存储一个kv结构,节点中的数据从左到右递增排列,非叶子节点可以存储键和data,由于数据同时存在于叶子节点和非叶子结点中,无法简单完成按顺序遍历B树中的关键字,必须用中序遍历的方法。
B+树
非叶子节点不存储data,只存储索引,可以放更多的索引,叶子节点包含所有索引元素,叶子节点用指针连接,提高区间访问的性能,节点内还是节点之间数据是从左到右依次递增的,一个节点可以放16kb,1170个元素,1170*1170*16 2千万,高度为3,高度是由非叶子节点能放多少个索引元素决定的。
综上所述可以看出B+树效率最高的,这也是MySQL使用它的原因。
使用场景
B+树
1、全值匹配的查询指的是和索引中的所有列进行匹配,比如查询字段 name = ‘tom’。
2、匹配最左前缀的查询:比如为a列和b列设置联合索引,只要联合索引的第一列(a列)符合查询条件,索引就会被用到,若只是第二列(b列)符合条件则不会被用到该索引。
3、匹配列前缀的查询只匹配某一列的值的开头部分。
4、匹配范围值。
5、精准匹配某一列并范围匹配另外一列。
6、只访问索引的查询:在这里指的就是覆盖索引,即只需要访问索引,而无需访问数据行。
7、用于查询中的order by 操作:索引树中的节点是有序的。一般来说,若B-Tree可以按照某种方式查找到该值,那么也可以用这种方式用于排序。所以,如果 order by 子句中满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。
Hash
1、Hash索引必须进行二次查找,使用哈市索引两次查找,第一次找到相应的行,第二次读取数据,但是被频繁访问到的行一般会缓存在内存中,这点对数据库性能的影响不大。
2、hash索引不能用于外排序,hash索引存储的是hash码而不是键值,所以无法用于外排序。
3、hash索引不支持部分索引查找也不支持范围查找,只能用到等值查询,不能范围和模糊查询。
4、hash索引中的hash码的计算可能存在hash冲突。