在 MySql“order by”子句中高效地进行数学运算?

问题描述 投票:0回答:3

我曾多次被告知,使用数学进行 SELECT 非常有效,而在 WHERE 子句中使用数学则效率不高。 这些情绪正确吗? 这如何应用于 ORDER BY 子句?

谢谢!!

示例:

SELECT a.* FROM a ORDER BY (a.field_1*a.field_2)
mysql sql-order-by
3个回答
5
投票

如果结果大于 sort_buffer_size,您的查询将必须使用磁盘上的临时文件对整个表进行排序。

您可能想在表中添加一列来保存 field1*field2 的值。 这当然会稍微使您的数据非规范化,但您可以在现场创建索引。

如果新字段有索引,那么MySQL可以读取使用该索引预先排序的数据,因为MySQL索引是b*tree结构,而b*tree结构是按预先排序的顺序存储的。 这不会为排序带来额外的磁盘 IO 或 CPU 活动,并且您只需扫描表一次。


1
投票

这是个好主意,但我从来不认为在

ORDER BY
子句中使用数学函数有任何意义。

您可以通过别名使用它:

select *,(intId * intId)as xalias from m_xxx_list order by xalias;

select * from m_xxx_list order by (intId + intId);

是的,如果你使用的是MySQL的数学聚合函数,那么测试一下。


0
投票

为了使 MySQL 按计算值对结果进行排序,它实际上需要在基于

WHERE
子句过滤掉行之后动态计算该值。如果结果集非常大,那么MySQL将需要计算所有行的结果。

对于较小的结果集,这应该没问题。但是,结果集越大(在应用

LIMIT
之前),服务器需要执行的计算就越多,只需计算出对行进行排序的值。如果计算是确定性的,那么您应该缓存将其放入结果集中的列中,然后对其进行索引。如果它是动态的,那么您需要确保您的 CPU 能够胜任该任务。

在提供的情况下,我建议创建一个列

a.field_3
,并将
(a.field_1*a.field_2)
的结果存储在其中。每当
a.field_1
a.field_2
的值发生变化时,您就需要重新计算结果。

© www.soinside.com 2019 - 2024. All rights reserved.