2

虽然这个问题是特定于 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]
4

1 回答 1

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 等...)会尝试预先计算每个中间结果集以提供最佳性能,实际上引擎在这里做得很好。

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

我希望它有所帮助。

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

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

于 2012-11-09T18:23:30.353 回答