[英]Index Usage in MySql InnoDb
我想知道 Mysql InnoDb 引擎中的索引使用情况。
下面是简化的例子。
字段
a, b, c, d
指标
Q.1在这种情况下,索引使用多长时间? (a, b?) (a, b, d?)
Q.2如何针对这种情况优化索引?
Q.3可以在二级索引中包含主键(聚集索引)吗? 还是在 WHERE 子句末尾比较主键字段更好?
谢谢。
跑你的马。 该查询可能不会使用索引,但您可以获取执行计划并进行验证。
以下索引可以提高性能。 再次验证执行计划:
create index ix1 on t (a, c, b);
您甚至可以尝试“覆盖索引”:
create index ix1 on t (a, c, b, d);
为了一点额外的性能(以更重的索引为代价)。
在 InnoDB 中,PK 始终包含在所有二级索引中。 MyISAM 不是这种情况,但这不是您的用例。
在二级索引的开头使用 PK很少有任何用处。 它可能有用的一种情况是,如果整个SELECT
所需的所有列都包含在索引中。 你的例子不是那种情况。 (参见:《覆盖指数》)
WHERE
中子句AND'd
的顺序无关紧要。 INDEX
中列的顺序很重要。
除了“覆盖”,没有索引会完全优化Where a = 3 And b >= 5 And c = 4 Order by d Limit 10
。 请参阅Index Cookbook以了解用于查找最佳索引的算法。 正如已经建议的: (a,c,b)
或(c,a,b)
。
(a, c, b, d)
只有在“覆盖”时才会有帮助。 ( SELECT...
??
(a, b, d)
可能运行得更快,但是有风险。 如果很快就找到所需的 10 行,它会很快。 但是如果表中没有完整的 10 行,这将是一个缓慢的表扫描。
“使用文件排序”是ORDER BY
和/或GROUP BY
的结果。 索引可能有用,但仅使用索引无法完成查询。
是的,PK 列总是包含在 InnoDB 辅助键中。 但它们将被附加到最后。 请记住, INDEX
中的顺序很重要,并且正如我的食谱所示, =
列需要在索引定义中首先列出。
“如何使用索引覆盖 WHERE 和 ORDER BY 子句?” - 完成回答的另一件事。 尽管“覆盖”索引可以“覆盖”这两个子句,但它不能阻止“文件排序”,因为“范围”测试 ( <
) 和ORDER BY
的混合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.