我想知道Mysql InnoDb引擎中的索引使用情况。
下面是简化的示例。
A,b,c,d
选择。其中a=3和b >= 5,c=4阶,d极限为10;
Q.1在这种情况下,使用多长时间的索引?(a,b ?)(a,b,d?)
Q.2如何优化这种情况下的索引?
Q.3是否可以在辅助索引中包含主键(聚集索引)?或者比较WHERE子句末尾的主键字段更好?
谢谢。
发布于 2022-04-21 19:11:51
Q1
跑跑你的马。该查询可能不会使用索引,但您可以获得执行计划并进行验证。
Q2
下面的索引可以提高性能。同样,验证执行计划:
create index ix1 on t (a, c, b);您甚至可以尝试“覆盖索引”:
create index ix1 on t (a, c, b, d);为了一点额外的性能(代价是一个更重的指数)。
Q3
在InnoDB中,PK总是包含在所有二级索引中。这不是MyISAM的情况,但这不是您的用例。
发布于 2022-04-24 18:33:26
在二级索引的开头有PK是非常罕见的,这是非常有用的。它可能有用的一种情况是,整个SELECT所需的所有列都包含在索引中。你的例子不是那种情况。(比照:“覆盖指数”)
AND'd从句在WHERE中的顺序并不重要。INDEX中列的顺序确实很重要。
除了“覆盖”,没有任何索引将完全优化Where a = 3 And b >= 5 And c = 4 Order by d Limit 10。有关查找最优索引的算法,请参见。如前所述:(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的混合,它不能阻止"filesort“。
https://stackoverflow.com/questions/71959669
复制相似问题