2012-11-09 102 views
2

虽然这个问题只针对MySQL,但我不介意知道这个答案是否适用于SQL引擎。MySQL查询效率建议

此外,由于这不是语法查询,因此为了简洁明了,我使用了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]是针对这个缓存运行'ed结果?如果不是这样,我应该那么查询分成两个像这样:

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

可悲的是,这个问题有点过于宽泛:查询,方案的细节和RDBMS将会影响答案。在当前版本的MySQL中,除了简单的布尔简化和可以使用索引的子句的优先次序之外,我认为优化器会选择一些不确定的次序来对剩余子句进行延迟评估。我不相信有没有什么办法可以在不通过另一个表的情况下影响这一点(尽管在多个查询中可以使用子查询中的物化表而不是临时表)。 – eggyal

回答

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:看看这个。这是关于下甲骨文在查询编译运营商和位次但它可能是反正知道是好事:

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

+0

明白了,并检查出链接。感谢所有的答复。看起来 - 长话短说 - 我应该安全地玩,并创建中间表以确保事情按照我想要的方式“缓存”。 – RonaldBarzell

+0

我真的,真的不认为你应该。你应该做的是1-建立一个与你的业务相匹配的DDL,并根据你想要做的查询来完善它。查询不应与模型相匹配,相反。 – Sebas

+0

谢谢。我有点这样做。我还没有组织我的表格,但我正在从我期望做的查询向后工作,并尝试(在规范化的限制之内)来相应地构建我的表格。然而,由于我很少了解(My)SQL如何优化事物,因此我的“查询优化”主要侧重于使我的查询更易于理解而不是高效。 – RonaldBarzell