代码之家  ›  专栏  ›  技术社区  ›  o.k.w

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

  •  1
  • o.k.w  · 技术社区  · 15 年前

    当我在另一本书中读到这个问题时,它偶然发现了我。 post .

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

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

    假设“members”表有很大的行数(或者查询足够复杂,可以在至少十几毫秒内执行)。MySQL或其他主流数据库引擎如何评估 SYSDATE() “在” ORDER BY “?

    假设查询需要半秒,微秒( FRAC_SECOND )“Sysdate”的更改次数为1000 x 1000 x 0.5=500 000次。

    我的问题是:

    1. “系统日期”是否在 开始执行查询或 获取评估结果并将其更改为 执行进度?
    2. 如果是后者,我能假设订购可能会混乱吗?

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   o.k.w    15 年前

    now()返回一个常量时间, 指示 语句开始执行。(在A内) 存储函数或触发器,现在() 返回函数的时间 或者触发语句开始 执行。)这与 sysdate()的行为,返回 它执行的确切时间 MySQL5.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()的行为不同, 它返回一个常量时间, 指示 语句开始执行。(在A内) 存储函数或触发器,现在() 返回函数的时间 或者触发语句开始 执行。

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

    更新:
    嗯,据我所知 Order by 将被执行或更好地说“使用”只有一次。因为 TIMESTAMPDIFF(FRAC_SECOND, DateCreated , SYSDATE()) 每次执行 SELECT 声明。所以,我想(再一次我想) ORDER BY 将考虑时间戳diff的第一个评估值或最后一个评估值。不管怎样,我认为通过执行这个-你每次都会得到一个随机的顺序。也许这里有比我更好的专家可以回答得更好。