关于索引
什么是自适应Hash索引
因为B+树可以采用到范围查找,同时是按照顺序的方式对数据进行存储,因此很容易对数据进行排序操作,在联合索引中也可以利用部分索引键进行查询,这些情况下,我们都没法使用Hash索引,因为Hash索引仅能满足(=)(<>)和 IN 查询,不能使用范围查询。
如果某个数据经常被访问,当满足一定条件的时候,就会将这个数据页的地址存放到Hash表中,这样下次查询的时候,就可以直接找到这个页面的所在位置。
需要说明的是自适应Hash索引只保存热数据,并非全表数据。
我们可以通过innodb_adaptive_hash_index变量来查看是否开启了自适应的Hash,比如:
show variables like '%adaptive_hash_index'
InnoDB 本身不支持 Hash 索引,但是提供自适应 Hash 索引,不需要用户来操作,存储引擎会自动完成。自适应 Hash 是 InnoDB 三大关键特性之一,另外两个分别是插入缓冲和二次写。
什么是联合索引的最左原则
当我们查询“x=9 AND y>8 AND z=7”的时候,如果建立了 (x,y,z) 顺序的索引,这时候 z 是用不上索引的。这是因为 MySQL 在匹配联合索引最左前缀的时候,如果遇到了范围查询,比如(<)(>)和 between 等,就会停止匹配。索引列最多作用于一个范围列,对于后面的 Z 来说,就没法使用到索引了。
通过这个我们也可以知道,联合索引的最左前缀匹配原则针对的是创建的联合索引中的顺序,如果创建了联合索引(x,y,z),那么这个索引的使用顺序就很重要了。如果在条件语句中只有 y 和 z,那么就用不上联合索引。
此外,SQL 条件语句中的字段顺序并不重要,因为在逻辑查询优化阶段会自动进行查询重写。
最后你需要记住,如果我们遇到了范围条件查询,比如(<)(<=)(>)(>=)和 between 等,那么范围列后的列就无法使用到索引了。
关于缓冲池
缓冲池和查询缓存是一个东西么
innoDB的存储引擎中有一部分数据会放到内存中,缓冲池占据了这部分内存的大部分,它用来存储各种数据缓存
- 数据页
- 插入索引
- 自适应索引
- 索引页
- 锁消息
- 数据字典信息
频次和位置这两个原则,可以帮助我们对I/O访问进行优化
- 位置决定效率,提供缓冲池就是为了在内存中直接访问数据
- 其次,频次优先级顺序,因为缓冲池大小有限, 会优先对使用频次高的数据进行加载
- 缓冲池的作用就是提升 I/O 效率,而我们进行读取数据的时候存在一个“局部性原理”,也就是说我们使用了一些数据,大概率还会使用它周围的一些数据,因此采用“预读”的机制提前加载,可以减少未来可能的磁盘 I/O 操作。
查询缓存
查询缓存是提前将查询结果缓存起来,这样下次不需要执行就可以拿到结果,需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果,这就意味者查询匹配的性能降低,只有相同的查询操作才会命中查询缓存,因此MySql的查询缓存命中率不高,在MySQL 8.0中已经被废弃。
缓冲池并不等于查询缓存,它们的共同点都是通过缓存的机制来提升效率。但缓冲池服务于数据库整体的 I/O 操作,而查询缓存服务于 SQL 查询和查询结果集的,因为命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。
网友评论