美好的一天。不知道是否已经问过,我看了但没找到任何东西,我甚至不确定“重新计算是正确的术语。”
我有一个查询,其中一个列由其他列的微积分组成,并被赋予别名:
SELECT col1 LIKE CONCAT(col2,"some_key%") as pivot1 ... others columns ...
WHERE col1 LIKE CONCAT(col2,"some_key%") = 1
目前我无法使用HAVING
获取当前数据库处理程序层限制。
问题是,微积分列col1 LIKE CONCAT(col2,"some_key")
是否会在select和where部分中执行两次,会造成双重资源损失?还有其他列计算为别名,然后在大表中的where子句中进行检查,因此性能具有相关性。
如果是这样,我们可以对旧的继承数据库处理程序进行一些编辑,否则我们会选择继续按原样使用它,暂时不花时间进行现代化。
提前感谢任何问题
答案 0 :(得分:2)
您不需要两次。 WHERE
子句意味着该表达式的值始终为1,因此您可以将其硬编码到SELECT
子句中。
SELECT 1 as pivot1, ...
FROM ...
WHERE col1 LIKE CONCAT(col2,"some_key%")
在测试比较运算符的结果时,您也不需要= 1
。它可以简单地单独用作布尔表达式。
我相信MySQL会重复计算。我做了以下测试:
select sum(username like '%x') from t_users where username like '%x' or 1=1;
select sum(1) from t_users where username like '%x' or 1=1;
第一个查询比第二个查询花了大约12%。
请注意,如果您在SELECT
子句中重复表达式,则表中的所有行都不会执行两次。它只会在JOIN
和WHERE
子句选择的结果集中的行上执行两次。因此,它可能不会像您期望的那样严重。例如,我测试过:
select sum(username like '%z') from t_users where username like '%z' ;
select sum(1) from t_users where username like '%z';
这些花费了大约相同的时间,因为WHERE
子句将结果集减少到表的大约1%。