基于这个答案: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”。
非常感谢提前!
答案 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)就可以了。