我曾多次被告知,使用数学 SELECT 非常有效,而在 WHERE 子句中使用数学不是很有效。这些情绪是否正确?这如何适用于 ORDER BY 子句?
谢谢!!
例子:
SELECT a.* FROM a ORDER BY (a.field_1*a.field_2)
我曾多次被告知,使用数学 SELECT 非常有效,而在 WHERE 子句中使用数学不是很有效。这些情绪是否正确?这如何适用于 ORDER BY 子句?
谢谢!!
例子:
SELECT a.* FROM a ORDER BY (a.field_1*a.field_2)
如果结果大于 sort_buffer_size,您的查询将不得不使用磁盘上的临时文件对整个表进行排序。
您可能希望在表中添加一个包含 field1*field2 值的列。这当然会使您的数据稍微反规范化,但是您可以在字段上创建一个索引。
如果在新字段上有索引,那么 MySQL 可以读取使用索引预先排序的数据,因为 MySQL 索引是 b*tree 结构,b*tree 结构是按预先排序的顺序存储的。这不会为排序产生额外的磁盘 IO 或 CPU 活动,您只需扫描表一次。
这是个好主意,但我从不认为在ORDER BY
子句中使用数学函数有任何意义。
您可以通过别名使用它:-
select *,(intId * intId)as xalias from m_xxx_list order by xalias;
或者
select * from m_xxx_list order by (intId + intId);
是的,如果您使用的是 MYSQL 的数学聚合函数,请对其进行测试。
为了让 MySQL 按计算值对结果进行排序,它实际上需要在根据WHERE
子句过滤掉行之后即时计算值。如果结果集非常大,那么 MySQL 将需要计算所有行的结果。
对于一个小的结果集,这应该没问题。但是,您的结果集越大(在应用 之前LIMIT
),那么服务器要做的计算就越多,只需找出对行进行排序的值。如果计算是确定性的,那么您应该将其缓存在结果集中的列,然后对其进行索引。如果它在运行中,那么您需要确保您的 CPU 能够胜任这项任务。
在提供的情况下,我建议创建一个列,a.field_3
并将结果存储(a.field_1*a.field_2)
在其中。每当a.field_1
或的值发生a.field_2
变化时,您都需要重新计算结果。