如何优化对WHERE
和ORDER 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.5
和10
是用户提供的值,这些值将在查询之间更改。这是一种简化 - 实际计算相对复杂,因此无法将结果存储在另一列中。
由于应用程序的限制,我无法将计算添加到SELECT
语句中。如何防止MySQL每行执行两次相同的计算?
最后,我应该使用WHERE
或HAVING
来过滤计算结果吗?
非常感谢。
答案 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