MySQL中的自适应哈希索引

众所周知,InnoDB使用的索引结构是B+树,但其实它还支持另一种索引:自适应哈希索引。

哈希表是数组+链表的形式。通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来解决。更多内容可以参考 百度百科-哈希表

从以上可以知道,哈希表查找最优情况下是查找一次.而InnoDB使用的是B+树,最优情况下的查找次数根据层数决定。因此为了提高查询效率,InnoDB便允许使用自适应哈希来提高性能。

可以通过参数 innodb_adaptive_hash_index 来决定是否开启。默认是打开的。

 
mysql> show variables like "innodb_adaptive_hash_index";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+

存储引擎会自动对个索引页上的查询进行监控,如果能够通过使用自适应哈希索引来提高查询效率,其便会自动创建自适应哈希索引,不需要开发人员或运维人员进行任何设置操作。

自适应哈希索引是对innodb的缓冲池的B+树页进行创建,不是对整张表创建,因此速度很快。

可以通过查看innodb的status来查看自适应哈希索引的使用情况。

mysql> show engine innodb  status \G
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2019-03-07 23:37:23 0x7f1f2d34c700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 6 seconds
------------------------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
-------------------------------
END OF INNODB MONITOR OUTPUT
============================

可以看到自适应哈希索引大小,每秒的使用情况。

注意从哈希表的特性来看,自适应哈希索引只能用于等值查询,范围或者大小是不允许的。

等着查询: select * from xx where name = "xxx";

原文地址:https://www.cnblogs.com/lgjlife/p/10493496.html

时间: 2024-11-05 18:45:28

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

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存储引擎会监控对表上索引的查找,如果观察到建立哈

自适应哈希索引

InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive)的.自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快.而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引. 根据InnoDB的官方文档显示,启用自适应哈希索引后,读取和写入速度可以提高2倍:对于辅助索引的连接操作,性能可以提高5倍.在我看来,自适应哈希索引是非常好的优化模式,其设计思想是数据库自优化

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

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

MYSQL中唯一约束和唯一索引的区别

1.唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null.2.创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引.唯一约束是通过唯一索引来实现数据的唯一.3.创建一个唯一索引,这个索引就是独立,可以单独删除.4.如果一个列上想有约束和索引,且两者可以单独的删除.可以先建唯一索引,再建同名的唯一约束.5.如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错. 约束是业务检查,比方说非空约束,chec

mysql中的字符串类型数据索引优化

摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法

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 ‘’,

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 '',

Mysql中索引的 创建,查看,删除,修改

创建索引 MySQL创建索引的语法如下: ? 1 2 3 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,...) 其中对应的语法变量信息如下: [UNIQUE|FULLTEXT|SPATIAL]中括号中的这三个关键字表示创建的索引类型,它们分别表示唯一索引.全文索引.空间索引三种不同的索引类型.如果我们不指定任何关键字,则默认为普通索引.inde