2009-11-22 33 views
1

當我在另一個post中讀取查詢時,它偶然發現了我。mySQL如何在ORDER BY中處理動態值

就拿下面的查詢(忽略不實用的排序):

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次。

我的問題是:

  1. 是否「SYSDATE」得到固定在 開始查詢執行的或作爲 執行進展它 獲取評估和變化?
  2. 如果是後者,我可以認爲排序可能混亂嗎?

UPDATE:
我原來的職位採用NOW動態值的一個例子,它是SYSDATE現在

+0

它是有道理的,當在ORDER BY中使用時,SYSDATE只評估一次,否則你會有一個移動目標,因爲SYSDATE是確定性的。由於行爲的不確定性,最好在查詢中將日期值設置爲變量之前使用。 – 2009-11-22 03:05:31

+0

@OMG Ponies:根據Heavy Btyes的帖子,SYSDATE在執行過程中進行評估,而不僅僅是一次。你有其他想法嗎? – 2009-11-22 03:40:46

回答

3

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()的行爲不同, 返回一個恆定的時間, 表示 語句開始執行的時間。

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

更新(在 返回,在其功能 或觸發語句開始 執行時間 存儲函數或觸發器,NOW()):
那麼從我所知道的Order by將被執行或更好地說「使用」一次。由於每次執行SELECT聲明時TIMESTAMPDIFF(FRAC_SECOND, DateCreated , SYSDATE())的值都會有所不同。所以,我認爲(我再次認爲)ORDER BY將考慮timestampdiff的第一個評估值或最後一個。無論如何,我認爲通過執行此操作 - 您每次都會得到一個隨機訂單。也許在這裏有比我更好的專家,他們可以更好地回答。

+0

啊我明白了,好的,讓我修改一下這個問題。順便說一下,這是很棒的信息。 +1 – 2009-11-22 01:11:37

+0

@Heavy Bytes:我用一個新的子問題修改了我的帖子。謹慎給它另一個鏡頭? :) – 2009-11-22 01:26:05

+0

那麼,從我知道的順序將被執行或更好地說「使用」只有一次。 由於TIMESTAMPDIFF(FRAC_SECOND,DateCreated,SYSDATE())的值在每次執行SELECT語句時都會有所不同。所以,我認爲(再一次考慮)ORDER BY將考慮timestampdiff的第一個評估值或最後一個。 無論如何,我認爲通過執行這個 - 你會得到一個隨機順序每次。也許在這裏有比我更好的專家,他們可以更好地回答。 – 2009-11-22 01:27:10