MySQL 执行计划是否取决于可用索引?

Ale*_*ukh 5 mysql innodb index database-design index-tuning

MySQL 是否会考虑哪些索引可用,为给定查询选择执行计划,还是先选择执行计划,然后在索引可用时使用索引?

动机:我想决定哪些索引是有用的。我有一些典型的查询。所以我可以想象两种可能的策略:

  • 如果计划不依赖于可用索引:查看这些查询的执行计划并添加对这些计划有用的索引,或者
  • 如果计划依赖于可用索引:添加所有可能的索引(很多!),查看查询计划,并删除未使用的索引。

我的数据库不是很大,所以我可以使用索引。我目前使用 InnoDB,但如果需要,我可以切换到 MyISAM 或其他。

Ric*_*mes 4

MySQL 的优化器只查看哪些索引可用。

5.6 中有一个例外:如果您有一个子查询,例如 FROM ( SELECT ... ) JOIN ( SELECT ... ) ...,则创建的临时表上没有索引。这曾经导致糟糕的性能。现在,优化器将尝试各种索引,并为 tmp 表创建最好的索引。我怀疑它只查找单列索引,而不是“复合”索引

InnoDB 最近最受关注。MyISAM 没有任何技巧。

尝试我的食谱,在给定 SELECT 的情况下创建最佳索引。它可能会为您节省一些错误的开始。