MySQL索引底层数据结构

索引定义

索引是帮助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冲突。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值