mySQL 如何处理 ORDER BY 中的动态值

Posted

技术标签:

【中文标题】mySQL 如何处理 ORDER BY 中的动态值【英文标题】:How does mySQL handle dynamic value within ORDER BY 【发布时间】:2009-11-22 01:03:21 【问题描述】:

当我在另一个 post 中阅读查询时,它偶然发现了我。

以下面的查询为例(忽略排序的非实际使用):

SELECT 
*
FROM Members 
ORDER BY (TIMESTAMPDIFF(FRAC_SECOND, DateCreated , SYSDATE()))

假设“成员”表的行数很大(或者查询足够复杂,至少需要十几毫秒才能执行)。 mysql或其他主流数据库引擎如何评估“ORDER BY”中的“SYSDATE()”?

假设查询需要半秒,“SYSDATE”的微秒 (FRAC_SECOND) 变化 1000 X 1000 X 0.5 = 500 000 次。

我的问题是:

    “SYSDATE”是否固定在 查询执行的开始或它 被评估并随着 执行进度? 如果是后者,我可以假设顺序可能混乱吗?

更新: 我的原帖使用NOW作为动态值的例子,现在是SYSDATE

【问题讨论】:

有意义的是,当在 ORDER BY 中使用时,SYSDATE 只评估一次,否则您将有一个移动目标,因为 SYSDATE 是确定性的。由于行为的不确定性,最好在查询中使用之前将日期值设置为变量。 @OMG Ponies:根据 Heavy Btyes 的帖子,SYSDATE 在执行期间被评估,而不仅仅是一次。你不这么认为吗? 【参考方案1】:

NOW() 返回一个常数时间 表示时间 语句开始执行。 (在一个 存储函数或触发器,NOW() 返回函数的时间 或触发语句开始 执行。)这不同于 SYSDATE() 的行为,它返回 它执行的确切时间 MySQL 5.0.12 的。

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_now

也就是说,语句执行时只执行一次。 但是,如果您想在每次执行时获取时间,您应该使用 SYSDATE

从 MySQL 5.0.12 开始,SYSDATE() 返回 它执行的时间。这 与 NOW() 的行为不同, 它返回一个常数时间 表示时间 语句开始执行。 (在一个 存储函数或触发器,NOW() 返回函数的时间 或触发语句开始 执行。)

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_sysdate

更新: 好吧,据我所知,Order by 只会被执行一次,或者更好地说“使用”一次。因为每次执行SELECT 语句时TIMESTAMPDIFF(FRAC_SECOND, DateCreated , SYSDATE()) 的值都会不同。所以,我认为(我再次认为)ORDER BY 将考虑 timestampdiff 的第一个评估值或最后一个评估值。无论如何,我认为通过执行这个 - 你每次都会得到一个随机顺序。也许这里有比我更好的专家可以回答得更好。

【讨论】:

啊,我明白了,好吧,让我稍微修改一下问题。顺便说一句,这是很好的信息。 +1 @Heavy Bytes:我用一个新的子问题修改了我的帖子。想再试一次吗? :) 好吧,据我所知,Order by 将只执行一次,或者更好地说“使用”一次。由于每次执行 SELECT 语句时 TIMESTAMPDIFF(FRAC_SECOND, DateCreated , SYSDATE()) 的值都会不同。所以,我认为(我再次认为) ORDER BY 将考虑 timestampdiff 的第一个评估值或最后一个评估值。无论如何,我认为通过执行这个 - 你每次都会得到一个随机顺序。也许这里有比我更好的专家可以回答得更好。 希望您不介意我将您的上述评论附加到您的答案中,我认为它对读者来说看起来更完整:P 太糟糕了,我不能两次投票给您:P 当然,您对答案满意吗?我想找出它是如何工作的最好方法是实际测试它:)

以上是关于mySQL 如何处理 ORDER BY 中的动态值的主要内容,如果未能解决你的问题,请参考以下文章

oracle使用order by排序null值如何处理?

oracle使用order by排序null值如何处理

MySQL 在 VARCHAR 上引用索引前缀时如何使用 ORDER BY?

如何处理在 php mysql 中返回多个值的内部查询?

MySQL NULL 值如何处理?

如何处理完全动态的 JSON 响应