【问题标题】:Is InnoDB index constructed in cache or disk?InnoDB 索引是在缓存还是磁盘中构建的?
【发布时间】:2021-10-12 09:14:33
【问题描述】:

我正在尝试了解 InnoDB 索引,但有些困惑。

InnoDB 索引(集群和辅助)是仅在缓存中构建还是在磁盘中构建并加载到缓存中?

由于聚集索引使用 B+ 树,叶页是在缓存中还是在磁盘中?它们是否包含实际的行数据或指向行数据的指针?

请随意参考任何相关文档或文章:-)

【问题讨论】:

  • 我已经编辑了这个问题,但它仍然关闭。我怎样才能重新打开它?
  • 所有索引和数据块都保存在磁盘上;它们被缓存在内存中的“buffer_pool”中。这同样适用于叶节点和非叶节点(除了更频繁地使用非叶节点,因此更有可能留在缓存中)。缓存(大致)是 LRU。缓存发生在读取和写入时。所有查询都作用于缓存中的块。指向行数据的“指针”是PRIMARY KEY 的列,它们被复制到二级索引中。 (我投票支持开放;如果重新开放,我可能会提供更多详细信息。)

标签: mysql indexing memory-management innodb b-tree


【解决方案1】:

您可能想阅读 Jeremy Cole 关于 InnoDB 页面结构内部的系列博客文章:https://blog.jcole.us/innodb/

这是我见过的对该主题最好的描述。他还开发了一些免费的 Ruby 脚本,他可以使用这些脚本检查 InnoDB 数据结构。

以下是对您的具体问题的一些简短回答:

InnoDB 索引,集群和辅助都存储在磁盘上。它们被组织成大小统一的页面。页面从磁盘复制到 RAM,称为 innodb 缓冲池。缓冲池中的页面与磁盘上的页面完全相同。索引确实在 RAM 和磁盘中都包含叶节点。

主索引的叶子节点基本上是一行;这包括相应行的所有列,但可能会溢出到其他页面的长 VARCHAR/BLOB/TEXT 内容除外。

二级索引具有包含数据值的叶节点,以及找到索引值的行的主键值。

因此,使用二级索引的查找必须搜索两个 B+树结构:首先是二级索引的树,它定位主键值。然后它随后在树中搜索主索引或聚集索引。这可能看起来很昂贵,但可以通过adaptive hash indexchange buffer 来缓解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 2012-11-13
    • 2011-03-04
    • 2015-03-27
    • 2012-05-13
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多