gpt4 book ai didi

mysql - 子查询更快?

转载 作者:行者123 更新时间:2023-11-29 01:32:43 25 4
gpt4 key购买 nike

如果我需要基于行数据执行复杂的计算,然后为它取别名,在一个查询中,由于限制性的 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;

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

最佳答案

I guess the real question is - will MySQL apply the WHERE clauses before performing the COMPLEX_CALC on all rows?

但是如果你仔细查看你的查询然后第一个运行COMPLEX_CALC 对满足 where 子句的所有行然后取 1000 个

第二个需要 1000 行,对其运行 COMPLEX_CALC 并且只取那些 having a1 > 100 这可能少于 1000 行

最重要的是您的查询在输出中不相同

在任何情况下,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,这由您来决定

关于mysql - 子查询更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6710592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com