【发布时间】:2018-06-21 10:16:53
【问题描述】:
表config的表结构:
- 属性(主键)
- 价值
- 说明
查询:
SELECT property, value FROM config
如果我在(property, value) 上放置一个覆盖索引,优化器仍然选择PRIMARY 索引,但EXPLAIN 中的extra 是NULL。如果我告诉优化器使用我的覆盖索引,EXPLAIN 中的extra 是USING INDEX。
这里到底发生了什么?为什么优化器默认选择PRIMARY 索引而不是我的覆盖索引?我是否通过告诉优化器使用我的覆盖索引来避免磁盘 IO?
【问题讨论】:
-
如果选择表的所有记录,则不需要索引。例如,当使用
where子句时,索引就派上用场了。经验法则是为where子句中使用的所有列定义索引。 -
我使用覆盖索引的目标是从内存而不是磁盘中检索数据。我感到困惑的是,当我让优化器使用它对 PK 的选择而不是我的覆盖索引时,是否发生了磁盘 IO。
-
通常优化器会选择比你更好的方式。并且索引并不意味着数据存储在内存中。索引有助于查找数据。你应该阅读它。我认为您并不真正了解它们的工作原理
-
来自dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-queries.html:“如果索引包含结果集所需的所有列(称为覆盖索引),则查询可能完全避免读取表数据。”由于 InnoDB 索引存储在内存中(给定足够大的内存池),这意味着数据正在有效地从内存中检索。
-
是的——它可能会。但这不是索引的实际目的。
标签: mysql innodb clustered-index