【发布时间】:2020-07-27 22:54:58
【问题描述】:
当我们构造索引时,索引信息存储在磁盘中。但是如果我们执行像select这样的查询,索引将如何被使用。索引文件会被加载到 RAM 还是会使用任何缓存?非常感谢。
【问题讨论】:
标签: mysql innodb clustered-index
当我们构造索引时,索引信息存储在磁盘中。但是如果我们执行像select这样的查询,索引将如何被使用。索引文件会被加载到 RAM 还是会使用任何缓存?非常感谢。
【问题讨论】:
标签: mysql innodb clustered-index
您的问题似乎在“集群”与否之间摇摆不定。我将尝试解释它们的区别和用法。
InnoDB 的 PRIMARY KEY 与数据“聚集在一起”。有一个 BTree(实际上是 B+Tree)保存所有数据,按 PK 排序。
二级索引是独立的 BTree。它们按为索引指定的列排序。这种 BTree 的叶子包含 PK,因此它可以通过第二次查找获得整个记录。
BTree 由 16KB 块组成。每个块包含几行(经验法则:100 行。实际上,在 1 到 ~1000 之间。)
块被加载到“缓冲池”中根据需要。没有预加载整个 BTree。 SELECTs仅从 buffer_pool 访问数据和索引信息,不从磁盘访问。写操作可以从索引中读取以定位插入/修改/删除行所在或需要去的块。然后它请求从磁盘中获取块(除非已经缓存在 buffer_pool 中)。后台任务将负责刷新到磁盘。
作为“缓存”,整个数据或索引可能也可能不完全在buffer_pool中。
有关 BTree 和 B+Tree 的讨论,请参见 Wikipedia。
【讨论】:
Innodb 索引与 innodb 的所有其他数据页一起存储在 innodb_buffer_pool 中。
要检查查询的索引使用情况,请查看EXPLAIN {query} 输出。
【讨论】: