1、索引的资源消耗分析node
一、索引三大特色mysql
一、小:只在一个到多个列创建索引sql
二、有序:能够快速定位终点spa
三、有棵树:能够定位起点,树高通常小于等于33d
二、索引的资源消耗点code
一、树的高度,顺序访问索引的数据页,索引就是在列上创建的,数据量很是小,在内存中;blog
二、数据之间跳着访问排序
一、索引往表上跳,可能须要访问表的数据页不少;索引
二、经过索引访问表,主键列和索引的有序度出现严重的不一致时,可能就会产生大量物理读;内存
资源消耗最厉害:经过索引访问多行,须要从表中取多行数据,若是无序的话,来回跳着找,跳着访问,物理读会很严重。
2、自适应hash索引原理
一、原理过程
Innodb存储引擎会监控对表上二级索引的查找,若是发现某二级索引被频繁访问,二级索引成为热数据,创建哈希索引能够带来速度的提高,则:
一、自适应hash索引功能被打开
mysql> show variables like '%ap%hash_index'; +----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON |
+----------------------------+-------+
1 row in set (0.01 sec)
二、常常访问的二级索引数据会自动被生成到hash索引里面去(最近连续被访问三次的数据),自适应哈希索引经过缓冲池的B+树构造而来,所以创建的速度很快。
二、特色
一、无序,没有树高
二、下降对二级索引树的频繁访问资源
索引树高<=4,访问索引:访问树、根节点、叶子节点
三、自适应
三、缺陷
一、hash自适应索引会占用innodb buffer pool;
二、自适应hash索引只适合搜索等值的查询,如select * from table where index_col='xxx',而对于其余查找类型,如范围查找,是不能使用的;
三、极端状况下,自适应hash索引才有比较大的意义,能够下降逻辑读。
3、监控与关闭
一、状态监控
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
一、34673:字节为单位,占用内存空间总量
二、经过hash searches、non-hash searches计算自适应hash索引带来的收益以及付出,肯定是否开启自适应hash索引
二、限制
一、只能用于等值比较,例如=, <=>,in
二、没法用于排序
三、有冲突可能
四、MySQL自动管理,人为没法干预。
三、自适应哈希索引的控制
因为innodb不支持hash索引,可是在某些状况下hash索引的效率很高,因而出现了adaptive hash index功能,可是经过上面的状态监控,能够计算其收益以及付出,控制该功能开启与否。
默认开启,建议关掉,意义不大。能够经过 set global innodb_adaptive_hash_index=off/on 关闭和打开该功能。