InnoDB关键特性之自适应hash索引

一、索引的资源消耗分析

1、索引三大特点

  1、小:只在一个到多个列建立索引

  2、有序:可以快速定位终点

  3、有棵树:可以定位起点,树高一般小于等于3

2、索引的资源消耗点

  1、树的高度,顺序访问索引的数据页,索引就是在列上建立的,数据量非常小,在内存中;

  2、数据之间跳着访问

    1、索引往表上跳,可能需要访问表的数据页很多;

    2、通过索引访问表,主键列和索引的有序度出现严重的不一致时,可能就会产生大量物理读;

  资源消耗最厉害:通过索引访问多行,需要从表中取多行数据,如果无序的话,来回跳着找,跳着访问,物理读会很严重。

二、自适应hash索引原理

1、原理过程

  Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升,则:

  1、自适应hash索引功能被打开

mysql> show variables like ‘%ap%hash_index‘;
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

  2、经常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。

2、特点

  1、无序,没有树高

  2、降低对二级索引树的频繁访问资源

    索引树高<=4,访问索引:访问树、根节点、叶子节点

  3、自适应

3、缺陷

  1、hash自适应索引会占用innodb buffer pool;

  2、自适应hash索引只适合搜索等值的查询,如select * from table where index_col=‘xxx‘,而对于其他查找类型,如范围查找,是不能使用的;

  3、极端情况下,自适应hash索引才有比较大的意义,可以降低逻辑读。

三、监控与关闭

1、状态监控

mysql> show engine innodb status\G
……
Hash table size 34673, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

  1、34673:字节为单位,占用内存空间总量

  2、通过hash searches、non-hash searches计算自适应hash索引带来的收益以及付出,确定是否开启自适应hash索引

2、限制

  1、只能用于等值比较,例如=, <=>,in

  2、无法用于排序

  3、有冲突可能

  4、MySQL自动管理,人为无法干预。

3、自适应哈希索引的控制

  由于innodb不支持hash索引,但是在某些情况下hash索引的效率很高,于是出现了adaptive hash index功能,但是通过上面的状态监控,可以计算其收益以及付出,控制该功能开启与否。

  默认开启,建议关掉,意义不大。可以通过 set global innodb_adaptive_hash_index=off/on 关闭和打开该功能。

原文地址:https://www.cnblogs.com/DataArt/p/10182583.html

时间: 2024-10-09 01:04:50

InnoDB关键特性之自适应hash索引的相关文章

INNODB 关键特性

InnoDB关键特性包括: 插入缓冲(Insert BUffer),两次写(Double Write),自适应哈希索引(Adaptive Hash Index), 异步IO(Async IO),刷新邻接页(Flush Neighbor Page) INSERT BUFFER 可能是INNODB 存储引擎关键特性中最令人激动与兴奋的一个功能.INSERT BUFFER和数据页一样,也是物理页的一个组成部分. 插入缓冲被开创性地用于解决这个问题:对于非聚集索引的插入或更新,并不是每次直接插入索引页,

【InnoDB】插入缓存,两次写,自适应hash索引

InnoDB存储引擎的关键特性包括插入缓冲.两次写(double write).自适应哈希索引(adaptive hash index).这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性. 插入缓冲 插入缓冲是InnoDB存储引擎关键特性中最令人激动的.不过,这个名字可能会让人认为插入缓冲是缓冲池中的一个部分.其实不然,InnoDB缓冲池中有Insert Buffer信息固然不错,但是Insert Buffer和数据页一样,也是物理页的一个组成部分. 主键是行唯一的标识符,在应用程序

InnoDB和MyISAM是否支持hash索引

今天和同学探讨说MySQL哪些存储引擎支持hash索引,因为所看书籍MySQL版本和现有的MySQL版本有出入,故中间出了点歧义.所以就手动敲了一下代码,测试了一下MySQL8.0中的存储引擎是如何支持hash索引的. 我们都知道MySQL最常用的存储引擎为InnoDB和MyISAM.它们默认的存储引擎都是B-Tree(实质为B+Tree).他们本身都是不支持hash索引的.但是我们在建表时给某些字段添加hash索引,或者后期为某表添加hash索引时,如果他们的存储引擎为InnoDB或MyISA

InnoDB关键特性之double write

# 脏页刷盘的风险 两次写的原理机制 1.解决问题 2.使用场景 3.doublewrite的工作流程 4.崩溃恢复 # doublewrite的副作用 1.监控doublewrite负载 2.关闭doublewrite场景 一.脏页刷盘风险 关于IO的最小单位: 1.数据库IO的最小单位是16K(MySQL默认,oracle是8K) 2.文件系统IO的最小单位是4K(也有1K的) 3.磁盘IO的最小单位是512K 因此,存在IO写入导致page损坏的风险: 二.doublewrite:两次写

InnoDB存储引擎之InnoDB关键特性

1.插入缓冲 A.Insert Buffer 听名字会让人理解为插入缓冲是缓冲池中的一部分.其实不是这个样子的,InnoDB缓冲池中有Insert Buffer信息,但是Insert Buffer和数据页一样,也是物理页的一个组成部分.在InnoDB存储引擎中,行记录的插入顺序是按照主键递增的顺序进行插入的.因此插入聚集索引(Primary Key)一般是顺序的,不需要磁盘的随机读取.但是并不是所有的主键都是顺序的.如主键是UUID这类的,那么插入和辅助索引一样都是随机的.所以在建表时主键是关键

InnoDB关键特性之change buffer

一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主键来访问MySQL表的性能是最好: 1.显式定义主键:primary key 2.隐式定义主键:如果没有指定主键,MySQL自己会默认建立一个主键(rowid隐藏主键) 1.特点 1.表按照主键排好序,数据按照主键顺序存放(核心原因) 2.主键上有一棵树,叶子节点就是数据节点 3.表本身就是索引,表

B-Tree 索引和 Hash 索引的对比

对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的特点 B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较.如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引.比如,以下 SELECT 语句就使用索引: SELECT * FROM tbl_name WHER

B-Tree 索引和 Hash 索引的对照

对于 B-tree 和 hash 数据结构的理解可以有助于预測不同存储引擎下使用不同索引的查询性能的差异.尤其是那些同意你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的特点 B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比較.假设 LIKE 的參数是一个没有以通配符起始的常量字符串的话也可以使用这样的索引. 比方.下面 SELECT 语句就使用索引: SELECT * FROM tbl_name WH

InnoDB的三个关键特性

http://www.cnblogs.com/benshan/archive/2013/01/14/2859336.html InnoDB的三个关键特性 InnoDB存储引擎的三个关键特性:插入缓冲(insert buffer).二次写(double write).自适应哈希索引(adaptive hash index). 1.插入缓冲(insert buffer)的原理: 对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,