MySQL:优化涉及计算的查询

时间:2011-08-02 15:29:16

标签: mysql optimization

如何优化对WHEREORDER BY使用相同计算的查询?

例如:

SELECT a, b
FROM my_table
WHERE    SIN(a) + COS(b) + TAN(5.5) < 10
ORDER BY SIN(a) + COS(b) + TAN(5.5)
此示例中的

5.510是用户提供的值,这些值将在查询之间更改。这是一种简化 - 实际计算相对复杂,因此无法将结果存储在另一列中。

由于应用程序的限制,我无法将计算添加到SELECT语句中。如何防止MySQL每行执行两次相同的计算?

最后,我应该使用WHEREHAVING来过滤计算结果吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以通过存储计算列来执行此操作,该列通过触发器进行更新。缺点是它会占用一些额外的空间,并且会减慢插入和更新的速度。但是,根据您的具体情况,我甚至可能会更快。这还取决于你需要多少计算。对于数据库中的各种其他事物,你需要所有a,b,c的cos,sin,tan值,还是只需要sin(a),cos(b)和tan(c)。也许你甚至可以存储SIN(a)+ COS(b)+ TAN(c)的最终结果。

答案 1 :(得分:1)

我没有在我面前开发机器,这有用吗?

SELECT a, b
FROM my_table
ORDER BY ( SIN(a) + COS(b) + TAN(5.5) )
HAVING   ( SIN(a) + COS(b) + TAN(5.5) ) < 10

如果确实如此,HAVING语句不应重新计算等式。

答案 2 :(得分:1)

试试这个

SELECT a, b from (
   SELECT a, b, SIN(a) + COS(b) + TAN(5.5) as filter
   FROM my_table
) as tmp1
WHERE  filter < 10
ORDER BY filter