MySQL查询效率建议

时间:2012-11-09 17:47:07

标签: mysql sql database

虽然这个问题是针对MySQL的,但我不介意知道这个答案是否适用于SQL引擎。

此外,由于这不是语法查询,我使用psuedo-SQL是为了简洁/清晰。

假设C [1] .. C [M]是一组标准(由AND或OR分隔)和Q [1] .Q [N]是另一组(由OR分隔)。我想用C [1] ... C [M]来过滤一个表,从这个过滤后的表中,我想要所有符合Q [1] ...... Q [N]的行。

如果我这样做:

SELECT ... FROM  ... WHERE (C[1]...C[M]) AND (Q[1]...Q[N])

这是否会自动优化,以便只找到一次C [1] ... C [M]并且每个Q [i]都针对此缓存结果运行?如果没有,我是否应该将查询拆分为两个:

INSERT INTO TEMP ... SELECT ... FROM ... WHERE C[1]...C[N]
SELECT ... FROM TEMP WHERE Q[1]...Q[N]

1 个答案:

答案 0 :(得分:0)

这是内部查询优化器的工作,用于计算根据过滤器编译连接的最佳顺序。

例如:

SELECT * 
FROM
    table1 
        INNER JOIN table2 ON table1.id = table2.id AND table2.column = Y
        INNER JOIN table3 ON table3.id2 = table2.id2  AND table3.column = Z
WHERE
    table1.column = X

Mysql(/ oracle / sqlserver等...)尝试预先计算每个中间结果集以提供最佳性能,实际上这里的引擎做得非常好。

但是,一切都依赖于它实际上有关表和您在架构中设置的索引的统计信息。这两点(除了用数据填充表格......)是唯一可以影响的点,通过为其提供正确和准确的信息来帮助优化器做出正确的决策。

我希望它有所帮助。

ps:看看这个。这是关于oracle下的查询编译中的运算符和优先顺序,但无论如何都可能是一件好事:

http://ezinearticles.com/?Oracle-SQL---The-Importance-of-Order-of-Precedence&id=1597846