子查询更快?

时间:2011-07-15 16:59:43

标签: mysql

如果我需要基于行数据执行复杂计算,然后对其进行别名,那么由于限制where子句,可能只需要对10000行中的10行进行操作的查询,最好是在子查询中使用子查询FROM子句,而不是使用单个查询?

一个例子可能更容易:

SELECT *,COMPLEX_CALC(t1.c10) AS a1 
FROM t1 
WHERE c2 > 5 AND c3 < 10 AND C6 = 4 AND c7 > 50
HAVING a1 > 100
LIMIT 1000;

或者

SELECT *,COMPLEX_CALC(ta1.c10) AS a1
FROM
    (SELECT * FROM t1
     WHERE c2 > 5 AND c3 < 10 AND C6 = 4 AND c7 > 50
     LIMIT 1000) as ta1
HAVING a1 > 100;

哪个查询会更快?我想真正的问题是 - 在所有行上执行COMPLEX_CALC之前MySQL会应用WHERE子句吗?

2 个答案:

答案 0 :(得分:3)

  

我想真正的问题是 - MySQL会应用WHERE子句吗?   在对所有行执行COMPLEX_CALC之前?

但是,如果你仔细查看你的查询,那么首先运行 所有行上的COMPLEX_CALC满足where子句,然后取1000个

在secon上需要1000行,在其上运行COMPLEX_CALC并仅使用那些可能少于1000行的having a1 > 100

botton行是您的查询输出不相同

在任何情况下COMPLEX_CALC实际上都运行两次:对于having子句中的每一行,然后在select部分中第二次(由于限制而高达1000次)。

我建议:

SELECT * 
  FROM (SELECT *,COMPLEX_CALC(t1.c10) AS a1 
          FROM t1 
         WHERE c2 > 5 AND c3 < 10 AND C6 = 4 AND c7 > 50) subtbl
 WHERE a1 > 100
 LIMIT 1000;

如果您需要此处limit或子查询

,请致电

答案 1 :(得分:2)

来自高性能MySQL第二版:

The most important advice we can give on subqueries is that you should usually pre- fer a join where possible, at least in current versions of MySQL. We covered this topic extensively earlier in this chapter.

如果在查询之前放置'EXPLAIN',mysql将显示执行此查询将运行的步骤,并且使用reslt,您应该能够看到更快运行的内容。

你能用'EXPLAIN'执行这2个查询并返回输出吗?