当一个是常数时,两列索引(A,B)和索引(B)的A和B指南

时间:2013-01-04 03:20:01

标签: mysql sql performance indexing

基于这个答案:https://stackoverflow.com/a/2349824/1382306

A和B的用法是否有进一步的指导原则,还是同样重要?

我有SELECT FROM table1, table2 WHERE table2.table1id = table1.id AND table2.constant = ?

就我而言,我知道吗?来自用户定义的变量。这有什么不同,因为它永远不会改变?

我可以推动我的运气,并要求对(A,B)和(B)使用的逻辑进行解释,例如“发现所有B都有As,并且接下来会搜索所有B”。

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

您的问题中没有写过任何问题,但我想您想知道应该使用哪种索引。

table2上,您应该在(constant, table1id)table1上拥有索引,无论如何您都拥有主键id。如果您只选择table2中的几列,则也应将它们包含在索引中。这样MySQL就可以直接从索引中回答您的查询,甚至无需加载table2的数据。它通过在索引中查找constant来实现,因为constant是索引的最左列,然后也从索引加载table1id。如果发生这种情况,您可以在EXPLAIN的输出中看到使用索引

答案 1 :(得分:1)

隐藏在另一篇热门帖子https://stackoverflow.com/a/4120191/1382306中,看起来像是

“在索引列定义中从左到右处理覆盖索引(多个列上的索引)时,查询需要解决列的顺序。语句中的列顺序无关紧要,只有第1,2列和第3列 - 在使用索引之前,语句需要引用第1列。如果只引用第2列或第3列,则不能使用1/2/3的覆盖索引。 / p>

在MySQL中,查询中每个SELECT /语句只能使用一个索引(子查询/ etc被视为一个单独的语句)。并且MySQL允许的每个表的空间量有限制。此外,在索引列上运行函数会使索引无用“

在答案中也有一个很好的索引陷阱列表。


在我的情况下,因为“在查询中每个SELECT /语句只能使用一个索引”我猜测只使用(?,table2.table1id)就可以了。