Mysql哈希索引

哈希索引原理

哈希索引原理其实就是hash表,搜索时间效率O(1),搜索效率好,也意味着磁盘IO花费少,mysql底层使用的是链式哈希表,结构如下,每一个bucket就是一个个哈希桶,也就是哈希链表的头结点。哈希结构天然的需要耗费空间资源,是一种用空间换时间的做法

哈希要点:

  • 解决哈希冲突的几种方式
  • 再哈希的参数碰撞因子或者说负载因子

image-20211230101130495

说白了就是用的拉链法去解决的哈希冲突,也正是这个结构造成了哈希索引的一些特性

  • 哈希表没有顺序可言,只能进行等值查询,不支持范围搜索
  • 哈希表不稳定,效率最差可能变为O(n),因为哈希冲突链表可能会变长
  • 天然不能减少磁盘IO,要基于内存
  • 会锁住桶,有可能造成阻塞

创建哈希索引sql语句如下

create index nameidx on student(name) using hash;

提示一下即使创建的是hash索引,也不一定就是哈希结构,Mysql会自动优化,具体用的是什么索引还是需要看看的,依然有可能使用的还是BTREE索引

show indexes from student;

自适应哈希索引

不讲人话部分

在MySQL 5.7中,自适应哈希索引搜索系统是分区的。每个索引被绑定到具体分区,每个分区由一个单独的锁闩保护。

分区由innodb_adaptive_hash_index_parts配置选项控制。在在早期版本中,自适应哈希索引搜索系统是由一个锁存器保护的在繁重的工作负载下可能会成为争论的焦点。的Innodb_adaptive_hash_index_parts选项默认设置为8。最大可设置为512。

哈希索引总是基于表上现有的b -树索引构建的。InnoDB可以构建一个为b -树定义的键的任意长度的前缀上的哈希索引,这取决于InnoDB对B-tree索引的搜索模式。一个散列索引可以是部分的,只覆盖那些经常被访问的索引页。对自适应哈希索引的使用和对其使用的争用SHOW ENGINE INNODB STATUS命令输出的信号量部分。如果你看到如果有很多线程在btr0sea.c中创建一个RW-latch,那么禁用它可能会很有用自适应哈希索引。

这段话很难理解,我也觉得mysql官方文档这段不讲人话,那接下来往下看

讲人话部分

自适应哈希索引其实是MySql自己创建的索引,前面关于聚簇索引跟非聚簇索引有说到,辅助索引在数据没有覆盖的情况下需要二次回表,也就是使用先使用辅助索引再使用主键索引

辅助索引不带有实际的数据,那么可不可以对辅助索引做一个优化呢,自适应哈希索引就是这么诞生的

Innodb存储引擎检测到某个二级索引不断被使用,那么他就会根据这个二级索引,在内存上根据二级索引B+树的结构创建一个哈希索引,用于加速搜索

image-20211230103349269

自适应哈希索引创建后,就会在等值查询的时候直接查询哈希索引,哈希索引上有数据的地址,这样就省下了辅助索引跟主键索引的搜索时间

其实创建哈希索引也是比较消耗资源的,这里有些衡量参数,要根据衡量参数决定是否打开或者关闭自适应哈希索引,mysql官方文档里面也讲了这个,上面不讲人话部分就是对何时创建自适应哈希索引以及如何禁用哈希索引、哈希索引锁的说明。

查看自适应哈希索引是否开启的命令

show variables like 'innodb_adaptive_hash_index';

查看自适应哈希分区(或者说桶)

show variables like 'innodb_adaptive_hash_index_parts';

两个比较重要的信息要注意,查看命令如下

show engine innodb status\G
  1. 能看到RW-latch等待的线程数量,自适应哈希索引默认分配了8个分区,同一个分区等待的线程数量过多
  2. 走自适应哈希索引搜索的频率和二级索引树搜索的频率

个人常用课程

C/C++Linux服务器开发/后台架构师
Golang DevOps项目实战

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MySQL哈希索引是一种用于加快数据检索速度的索引结构。哈希索引使用哈希函数将索引键映射到一个固定大小的哈希值,然后将哈希值与存储在内存中的哈希表进行匹配,以快速定位到所需的数据行。哈希索引的搜索时间复杂度为O(1),因为它直接通过哈希值进行查找,而不需要像B树索引那样进行逐层的比较。这使得哈希索引在某些特定场景下具有较高的检索效率。 然而,需要注意的是,MySQL哈希索引并非适用于所有情况。哈希索引的主要限制是它只支持等值查询,而不支持范围查询或排序操作。此外,哈希索引对于频繁的插入和删除操作也不太友好,因为这些操作可能导致哈希冲突,进而影响索引的性能。 此外,MySQL还引入了自适应哈希索引的概念。自适应哈希索引是一种动态索引结构,它根据查询模式自动选择是否使用哈希索引。自适应哈希索引可以根据实际查询情况动态地创建和删除哈希索引,以提高查询性能。但是,创建哈希索引也会消耗一定的资源,因此需要根据具体的衡量参数来决定是否打开或关闭自适应哈希索引。 总结来说,MySQL哈希索引是一种用于加快数据检索速度的索引结构,它具有快速的搜索效率和较低的磁盘IO开销。然而,哈希索引只适用于等值查询,并且对于频繁的插入和删除操作不太友好。自适应哈希索引是一种动态索引结构,可以根据查询模式自动选择是否使用哈希索引,以提高查询性能。 #### 引用[.reference_title] - *1* *2* *3* [Mysql哈希索引](https://blog.csdn.net/Reggie0202/article/details/122238967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_Csyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值