重新计算MySQL中的列

时间:2014-04-11 00:03:08

标签: mysql where-clause calculated-columns

美好的一天。不知道是否已经问过,我看了但没找到任何东西,我甚至不确定“重新计算是正确的术语。”

我有一个查询,其中一个列由其他列的微积分组成,并被赋予别名:

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子句中进行检查,因此性能具有相关性。

如果是这样,我们可以对旧的继承数据库处理程序进行一些编辑,否则我们会选择继续按原样使用它,暂时不花时间进行现代化。

提前感谢任何问题

1 个答案:

答案 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子句中重复表达式,则表中的所有行都不会执行两次。它只会在JOINWHERE子句选择的结果集中的行上执行两次。因此,它可能不会像您期望的那样严重。例如,我测试过:

select sum(username like '%z') from t_users where username like  '%z' ;

select sum(1) from t_users where username like '%z';

这些花费了大约相同的时间,因为WHERE子句将结果集减少到表的大约1%。