如果我需要基于行数据执行复杂计算,然后对其进行别名,那么由于限制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子句吗?
答案 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个查询并返回输出吗?