繁体   English   中英

MySql InnoDb 中的索引使用

[英]Index Usage in MySql InnoDb

我想知道 Mysql InnoDb 引擎中的索引使用情况。

下面是简化的例子。

  1. 字段
    a, b, c, d

  2. 指标

  • 一个(峰)
  • (a, b, d) (综合指数)
  1. 询问
    Select... 其中 a = 3 And b >= 5 And c = 4 Order by d Limit 10;

Q.1在这种情况下,索引使用多长时间? (a, b?) (a, b, d?)

Q.2如何针对这种情况优化索引?

Q.3可以在二级索引中包含主键(聚集索引)吗? 还是在 WHERE 子句末尾比较主键字段更好?

谢谢。

Q1

跑你的马。 该查询可能不会使用索引,但您可以获取执行计划并进行验证。

Q2

以下索引可以提高性能。 再次验证执行计划:

create index ix1 on t (a, c, b);

您甚至可以尝试“覆盖索引”:

create index ix1 on t (a, c, b, d);

为了一点额外的性能(以更重的索引为代价)。

Q3

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM