【高并发高性能高可用之海量数据MySQL实战-6】-MySQL自适应哈希索引

2022/2/12 2:12:32

本文主要是介绍【高并发高性能高可用之海量数据MySQL实战-6】-MySQL自适应哈希索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.概念

哈希(hash)是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次的查询。InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI) AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。 InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。

自适应哈希索引由 innodb_adaptive_hash_index 变量控制。也可以服务器启动时由 --skip-innodb- adaptive-hash-index 关闭。自适应哈希索引在查询过程中会被自动启用,将索引值转换为某种指针来加快查询速度。 InnoDB引擎自动监控索引搜索,如果注意到查询可以从构建哈希索引中受益,则会自动执行此操作。

2.创建的条件

1.官方文档

If a table fits almost entirely in main memory, a hash index can speed up queries by enabling direct lookup of any element, turning the index value into a sort of pointer. has a mechanism that monitors index searches. If notices that queries could benefit from building a hash index, it does so automatically.

2.解释

如果一个表几乎完全适合主内存,那么哈希索引可以通过直接查找任何元素来加快查询速度,将索引值转换为某种指针。具有监视索引搜索的机制。如果注意到查询可以从构建哈希索引中获益,那么它会自动这样做。

官方文档给出的内容非常含糊,并没有说明自适应哈希索引的创建条件,只是说自适应哈希索引会自动创建,没有细节。我从网上找到了一些资料虽然说的很详细,但是说的有点过于详细不能一目了然,所以我重新整理下。

3.自适应hash创建的条件

自适应hash索引(AHI)在实现上就是一个哈希表:从某个检索条件到某个数据页的哈希表,仿佛并不复杂,但其中的关窍在于哈希表不能太大(哈希表维护本身就有成本,哈希表太大则成本会高于收益),又不能太小(太小则缓存命中率太低,没有任何收益)。所以在创建AHI上还是有一些讲究的。

1.索引被查询的次数足够多。如果查询次数用N1来表示的话那么N1应该大于17(N1>17),此过程无时间限制。

2.基于查询的sql语句创建一个hash信息(hash info)其中包含了三部分内容:

①匹配索引的列数

②下一列匹配的字节数

③是否从左匹配

例如有如下SQL语句:

select * from table1 where a1=1 and a2=2;

 则生成如下哈希描述:

hash info(2, 0, true)

 如果这个生成的hash info被使用的次数足够多 (N2 > 100)

生成的hash info能够命中某个数据页,且命中的该页上的记录数要大于该页上总记录数的1/16(N3 > 页记录数的1/16)

满足以上三点要求那么就会将hash info生成一个key,value就是指向数据页上记录的指针。 这样就建立起了mysql的自适应哈希索引

3:参考文章

Mysql自适应哈希索引(Adaptive Hash Index)创建的条件 - 掘金



这篇关于【高并发高性能高可用之海量数据MySQL实战-6】-MySQL自适应哈希索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程