自适应哈希索引

InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive)的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。

根据InnoDB的官方文档显示,启用自适应哈希索引后,读取和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍。在我看来,自适应哈希索引是非常好的优化模式,其设计思想是数据库自优化(self-tuning),即无需DBA对数据库进行调整。

通过命令SHOW ENGINE INNODB STATUS可以看到当前自适应哈希索引的使用状况,如下所示:

1.mysql> show engine innodb status\G;

2.*************************** 1. row ***************************

3.Status:

4.=====================================

5.090922 11:52:51 INNODB MONITOR OUTPUT

6.=====================================

7.Per second averages calculated from the last 15 seconds

8.......

9.-------------------------------------

10.INSERT BUFFER AND ADAPTIVE HASH INDEX

11.-------------------------------------

12.Ibuf: size 2249, free list len 3346, seg size 5596,

13.374650 inserts, 51897 merged recs, 14300 merges

14.Hash table size 4980499, node heap has 1246 buffer(s)

15.1640.60 hash searches/s, 3709.46 non-hash searches/s

16.......

现在可以看到自适应哈希索引的使用信息了,包括自适应哈希索引的大小、使用情况、每秒使用自适应哈希索引搜索的情况。值得注意的是,哈希索引只能用来搜索等值的查询,如select * from table where index_col = ‘xxx‘,而对于其他查找类型,如范围查找,是不能使用的。因此,这里出现了non-hash searches/s的情况。用hash searches : non-hash searches命令可以大概了解使用哈希索引后的效率。

由于自适应哈希索引是由InnoDB存储引擎控制的,所以这里的信息只供我们参考。不过我们可以通过参数innodb_adaptive_hash_index来禁用或启动此特性,默认为开启。

Adaptive,意味着不是所有的叶页面都会以Hash索引维护,叶页面进入Hash 索引的条件是:同种类型的操作(Scan/Insert…),命中同一叶页面的次数,超过此页面记录数量的1/16,则可将当前叶页面加入Hash索引, 用以优化后续可能的相同Search Path。

mysql> show variables like ‘%adaptive_hash%‘;

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| innodb_adaptive_hash_index | ON    |

+----------------------------+-------+

默认为开启

时间: 2024-10-14 17:57:43

自适应哈希索引的相关文章

MySQL中自适应哈希索引

自适应哈希索引采用之前讨论的哈希表的方式实现,不同的是,这仅是数据库自身创建并使用的,DBA本身并不能对其进行干预.自适应哈希索引近哈希函数映射到一个哈希表中,因此对于字典类型的查找非常快速,如SELECT * FROM TABLE WHERE index_col='xxx'但是对于范围查找就无能为力.通过SHOW ENGINE INNODB STATUS 可以看到当前自适应哈希索引的使用情况 ------------------------------------- INSERT BUFFER

MySql 自适应哈希索引

一.介绍 哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为O(1).常用于连接(join)操作,如SQL Server和Oracle中的哈希连 接(hash join).但是SQL Server和Oracle等常见的数据库并不支持哈希索引(hash index).MySQL的Heap存储引擎默认的索引类型为哈希, 而InnoDB存储引擎提出了另一种实现方法,自适应哈希索引(adaptive hash index). InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈

MySQL中的自适应哈希索引

众所周知,InnoDB使用的索引结构是B+树,但其实它还支持另一种索引:自适应哈希索引. 哈希表是数组+链表的形式.通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来解决.更多内容可以参考 百度百科-哈希表 从以上可以知道,哈希表查找最优情况下是查找一次.而InnoDB使用的是B+树,最优情况下的查找次数根据层数决定.因此为了提高查询效率,InnoDB便允许使用自适应哈希来提高性能. 可以通过参数 innodb_adaptive_hash_index 来决定是否

自适应哈希索引(Adaptive Hash Index, AHI) 转

Adaptive Hash Index, AHI 场景 比如我们每次从辅助索引查询到对应记录的主键,然后还要用主键作为search key去搜索主键B+tree才能找到记录. 当这种搜索变多了,innoDB引擎会进行优化. 维护索引叶页面中所有记录的索引键值(或键值前缀)到索引叶页面位置的Hash映射关系, 能够根据索引键值(前缀)快速定位到叶页面满足条件记录的Offset,减少了B+树Search Path的代价,将B+树从Root页面至Leaf页面的路径定位,优化为Hash Index的快速

SQL Server2014 哈希索引原理

SQL Server2014 哈希索引原理 翻译自:http://www.sqlservercentral.com/blogs/sql-and-sql-only/2015/09/08/hekaton-part-6-hash-indexes-intro/ 跟哈希 join,哈希 聚合的原理一样,了解哈希索引的原理也会同时明白哈希 join和哈希 聚合的原理 SQL Server 2014推出的的新索引类型叫做 hash index.介绍hash index之前一定要介绍哈希函数这样会让大家更明白哈

MySQL B+树索引和哈希索引的区别

导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法: CREATE TABLE t(aid int unsigned not null auto_increment,userid int unsigned not null default 0,username varchar(20) not null default ‘’,

B+树索引和哈希索引的区别[转]

导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法: CREATE TABLE t(aid int unsigned not null auto_increment,userid int unsigned not null default 0,username varchar(20) not null default ‘’,

哈希索引

只有Memory引擎支持哈希索引(不讨论NDB集群支持唯一哈希索引的情况) 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效. 存储引擎会根据所有的索引计算出一个哈希码 哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行额指针. 因为索引只是只需要存储对应的哈希值,所以索引的结构十分紧凑,使得哈希表查询非常快. 哈希表有一下限制: 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中值来避免行读取 哈希索引不是按照索引顺序存储的,因此也无法用于排序 哈希索

MySQL B+树索引和哈希索引的区别(转 JD二面)

导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法: CREATE TABLE t(aid int unsigned not null auto_increment,userid int unsigned not null default 0,username varchar(20) not null default '',