美文网首页
关于索引和缓冲池

关于索引和缓冲池

作者: LegendGo | 来源:发表于2020-05-04 23:00 被阅读0次

关于索引

什么是自适应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访问进行优化
  1. 位置决定效率,提供缓冲池就是为了在内存中直接访问数据
  2. 其次,频次优先级顺序,因为缓冲池大小有限, 会优先对使用频次高的数据进行加载
  3. 缓冲池的作用就是提升 I/O 效率,而我们进行读取数据的时候存在一个“局部性原理”,也就是说我们使用了一些数据,大概率还会使用它周围的一些数据,因此采用“预读”的机制提前加载,可以减少未来可能的磁盘 I/O 操作。

查询缓存

查询缓存是提前将查询结果缓存起来,这样下次不需要执行就可以拿到结果,需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询对应的结果,这就意味者查询匹配的性能降低,只有相同的查询操作才会命中查询缓存,因此MySql的查询缓存命中率不高,在MySQL 8.0中已经被废弃。
缓冲池并不等于查询缓存,它们的共同点都是通过缓存的机制来提升效率。但缓冲池服务于数据库整体的 I/O 操作,而查询缓存服务于 SQL 查询和查询结果集的,因为命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

相关文章

  • InnoDB 缓冲池

    InnoDB 缓冲池 InnoDB 维护一个称为缓冲池的存储区域, 用于缓存内存中的数据和索引缓冲池的大小当然是越...

  • 关于索引和缓冲池

    关于索引 什么是自适应Hash索引 因为B+树可以采用到范围查找,同时是按照顺序的方式对数据进行存储,因此很容易对...

  • 索引

    索引小知识 缓冲池 基于磁盘的数据库系统都会有缓冲池(页/块)写操作,将页读入缓冲池,在缓冲池中对页进行修改,修改...

  • PostgreSQL中的预取算法

    关于Buffer 全部缓冲区构成一个缓冲池 缓冲池: 缓冲区管理跟踪BmTrace区 记录缓冲区被使用的状况 BM...

  • Mysql默认需要修改的配置项

    一,innodb_buffer_pool_size他是数据从硬盘取出,放在缓冲池是数据和索引缓存的地方,这个地方越...

  • 今日份打卡 176/365

    技术文章* 写缓冲* 一般写缓冲:以缓冲池为中心,双写缓冲池以及redo log* InnoDB优化写缓冲:以缓冲...

  • 23. 缓冲信道和工作池(Buffered Channels a

    23. 缓冲信道和工作池(Buffered Channels and Worker Pools) 什么是缓冲信道?...

  • 今日份打卡 174/365

    技术文章* InnoDB缓冲池* 缓冲池(buffer pool)是一种常见的降低磁盘访问的机制;* 缓冲池通常以...

  • Change Buffer【Mysql InnoDB系列】

    什么是Change Buffer? Change Buffer是一种用于缓存二级索引页变化的特殊数据结构,是缓冲池...

  • free()后内存不释放问题 - 内存缓冲池技术

    free()后内存不释放问题 - 内存缓冲池技术 free()后内存不释放问题 - 内存缓冲池技术

网友评论

      本文标题:关于索引和缓冲池

      本文链接:https://www.haomeiwen.com/subject/zarughtx.html