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 中的动态值的主要内容,如果未能解决你的问题,请参考以下文章