ORDER BY中的方程式

时间:2013-04-20 13:13:23

标签: php mysql sql

这可能吗?它是否会通过查询大约10,000个条目的表来减慢服务器的速度?

我的查询目前是

SELECT title, number1, number2 ORDER BY number1

我想做这样的事情

SELECT title, number1, number2 ORDER BY (number1 + (number2 *100)) 

4 个答案:

答案 0 :(得分:0)

尝试:

SELECT title, number1, number2, (number1 + (number2 *100)) as OrderCondition  
ORDER BY OrderCondition

如果您不希望性能命中缓存结果并为其添加索引。

答案 1 :(得分:0)

您在表格中创建第四列,如“myindex”。 在此列中,您可以输入等式的结果。 (这可以在PHP中或在INSERT上使用触发器完成。) 然后你只需按myindex选择订单。这应该更有效率。

答案 2 :(得分:0)

是的,可以这样做,你可以使用rokburgar建议的别名或只包括(number1 + (number2 *100)),但是这个计算也必须包含在SELECT语句中:

SELECT title, number1, number2, (number1 + (number2 *100)) ORDER BY (number1 + (number2 *100))

作为参考,您还可以在这里查看:MySQL sort on a calculation

答案 3 :(得分:0)

通常,在使用数据库时,读取和写入数据的开销远远大于计算开销。要使用filesort进行排序,必须多次读取和写入数据。这将比额外的计算花费更长的时间。

因此,在查询使用filesort的情况下,答案是order by中的计算在开销方面可以忽略不计。

另一方面,如果您要比较以下内容:

select title, number1, number2
from t
order by number1

AND 你有number1的索引,然后这将直接使用索引,绕过filesort。在这种情况下,order by中的计算会导致执行计划的成本更高。

如果表达式(number1 + (number2 *100))是您真正关心的数据元素,您可以考虑将其直接存储在数据库中并在其上构建索引,可能使用触发器来保持更新。

如果你知道number总是在0到99之间,那么你可以通过以下方式获得更好的表现:

order by number2, number1

且索引为(number2, number1)