我发现 Zardosht Kasheff 的以下演讲很有启发性:
http://www.infoq.com/presentations/Index-SQL
但它只涵盖了对单个表进行简单查询的情况。
涉及多个表的查询是否有类似的东西?可能包括 GROUP BY?
我正在寻找一些理论/指南,我可以将它们应用于带有 InnoDB 存储引擎的 MySQL。
我发现 Zardosht Kasheff 的以下演讲很有启发性:
http://www.infoq.com/presentations/Index-SQL
但它只涵盖了对单个表进行简单查询的情况。
涉及多个表的查询是否有类似的东西?可能包括 GROUP BY?
我正在寻找一些理论/指南,我可以将它们应用于带有 InnoDB 存储引擎的 MySQL。
一个常见的错误是
当你
JOIN
有两个表时,你通常会得到行数的爆炸式增长。然后SUM
完成,可能会反复总结 a.foo,导致“错误”(太大)答案。但这不是你问的。
A
JOIN
几乎总是这样执行的:WHERE
)。到目前为止,单表规则适用。那么,您要问的新问题是如何进入表 2?有一个
ON
子句(假设它不是“交叉连接”)。这为您提供了一个(或多个)应在表 2 的“最佳”索引中使用的字段。然后使用该字段,加上 中的任何其他字段WHERE
,以及单表规则来为该构建最佳索引JOIN
。由于优化器可能会选择不同的表顺序,或者可能希望有多个选择,因此请为每个顺序找到最佳索引。
然后简化。
INDEX(x), INDEX(x,y)
-->INDEX(x,y)
PRIMARY KEY
表 2,则不需要更长的索引。EXPLAIN
会说“Using index”,不要和“Using index condition”混淆,这是ICP。)以下是有关优化器在连接两个表时如何思考的一些提示:
WHERE
将在没有过滤器的表之前被选择。ORDER BY
比 a 更受欢迎。WHERE
LIMIT
很少是一个因素,尽管它可能应该是。我的食谱也关注单表;也许这个答案会帮助我写关于
JOINs
.