0

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

A 和 B 的用法是否有进一步的指导方针,或者它们是否同样重要?

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

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

我能否碰碰运气并要求解释针对(A,B)和(B)使用的逻辑,例如“找到所有具有As的B,然后搜索所有B”。

提前谢谢了!

4

2 回答 2

2

你没有在你的问题中写任何问题,但我假设你想知道你应该使用什么样的索引。

table2你应该有一个索引,无论如何(constant, table1id)你有table1你的主键。id如果您只从中选择几列,table2则也应将它们包含在索引中。这样 MySQL 可以直接从索引中回答您的查询,甚至无需加载table2. 它通过constant在索引中查找来做到这一点,它可以这样做,因为它constant是索引的最左边的列,然后table1id也从索引中加载。如果发生这种情况,您可以在输出中看到Using indexEXPLAIN

于 2013-01-04T03:24:26.207 回答
1

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

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

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

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


就我而言,因为“查询中的每个 /statement 只能使用一个索引SELECT”,我猜想只使用 (?, table2.table1id) 是要走的路。

于 2013-01-04T03:48:36.813 回答