数据缓存和索引缓存是什么?其作用是?

数据缓存

指把数据行 (也就是实际的数据) 缓存到内存中

优点:

  • 加快数据的读取操作
  • 减少磁盘I/O,提升查询性能

缺点:

  • 如果更新频繁,缓存会产生大量”脏页”,产生I/O压力 (可以了解关于缓存池如何处理数据更新的知识)
  • 占用内存空间较多

适用场景:

  • 需要快速响应的查询场景
  • 有热点数据的、查询频繁的场景

实现:

  • 缓存一般由数据库管理系统 (DBMS) 自动维护
  • MySQL的InnoDB引擎通过Buffer pool管理缓存
  • 应用层可以使用一些缓存中间件实现

索引缓存

指把索引结构上的索引节点缓存到内存中 (可能是部分节点,也可能是全部)

优点:

  • 加快数据的定位操作
  • 减少磁盘I/O,提高索引查找的效率

缺点:

  • 索引频繁更新 (插入、删除或者更新索引列的数据),缓存也会产生大量脏页,并且索引的更新可能是跨页的,会比数据缓存更新复杂,带来I/O压力。
    (索引更新也需要维护索引结构,比如b+树)
  • 如果索引列较多,占用内存空间较大

适用场景:

  • 查询频繁、且经常使用索引列的场景

实现:和数据缓存的实现相同,因为一般都使用同一个内存区域

数据缓存和索引缓存的协同作用

以InnoDB为例,一个查询流程:

  1. 查询条件命中某索引
  2. 检查缓存池中是否有相关索引页 (索引缓存)
  3. 没有的话就把索引页加载到缓存池
  4. 通过索引页找到数据页的位置
  5. 检查缓存池中是否有相关数据页 (数据缓存)
  6. 没有的话就把数据页加载到缓存池
  7. 读取目标数据并返回