2011-08-18 57 views
6

嗨,我有一個7milion記錄數據庫表,用於測試查詢速度。QUERY極限和千萬記錄速度

我測試了我的2個查詢這與不同的限制參數應用相同的查詢:

查詢1 -

SELECT * 
FROM  table 
LIMIT  20, 50; 

查詢2 -

SELECT * 
FROM  table 
LIMIT  6000000, 6000030; 

查詢EXEC時間:

  1. 查詢1 - 0.006秒
  2. 查詢2 - 5.500秒

在這兩個查詢的,我取相同數量的記錄,而在第二種情況下它採取更多的時間。有人可以解釋這背後的原因嗎?

+0

你有任何索引嗎?你有主鍵嗎?如果你沒有,那麼這對我來說很有意義。 –

+0

@amir如果沒有兩個查詢的索引應該是相同的測試不是?或者如果我把索引第二個查詢將採取同一時間的第一個查詢? – sbaaaang

+0

如果你根本沒有索引,那麼我不認爲MySQL可以跳過第一個6000000行。您必須至少有一些主索引才能跳過行。也許別人可以證實這一點?我們也可以測試這個。 –

回答

8

如果不仔細觀察它,我的假設是,這是因爲第一個查詢只需要讀取第50條記錄以返回結果,而第二個查詢在返回結果之前必須讀取六百萬條記錄。基本上,第一個查詢只是更快地縮短。

我會假設,這有一個令人難以置信的大量做表的妝容 - 字段類型和鑰匙等

如果一個記錄是由固定長度字段(如CHAR與VARCHAR ),那麼DBMS可以計算第n條記錄的起始位置並跳轉到那裏。如果它的可變長度,那麼你將不得不讀取記錄以確定第n條記錄開始的位置。同樣,我還會假設具有適當主鍵的表比沒有這些鍵的表的查詢更快。

+0

這就是我想肯定:(我認爲沒有解決方案的權利?只是查詢緩存:( – sbaaaang

+1

@用戶我想不出一種解決方案,我能想到的唯一的事情就是添加一個日期時間字段來標記創建的記錄,然後在該字段中添加一個索引,然後在查詢中對該字段進行排序,但我沒有測試過,但是您可能會欺騙數據庫以限制該密鑰,這可能會使查詢運行在O(1)的時間,但我不會指望它,而且,它不是你上面的查詢,因爲默認的排序順序是由spec定義的 - 你將模擬一個通用約定而不是spec; YMMV。 – AgentConundrum

+0

感謝您的黑客我會嘗試無論如何嘗試我只是問差異更好地理解mysql如何處理數據庫記錄;) – sbaaaang

6

我認爲減速與您使用偏移限制的事實有關,並且查詢表時沒有用於索引的額外上下文。它可能的第一個更快,因爲它可以更快地抵消偏移量。

+1

一些谷歌搜索表明,MySQL計數每一行,直到它到達偏移量..所以猜測它只需要更長的時間才能達到xxxxx的攻擊相比,第20行。 –

+0

這是真正的索引有沒有,但不是一個速度問題,我只是問有關的差異;) – sbaaaang

4

這是返回50行和6000030行之間的區別(或者說你的表示只有700萬行,大約有100萬行)。

在有兩個參數,第一參數指定的偏移 第一行的返回,和第二個指定的 行的最大數目返回。初始行的偏移量爲0(不是1):

SELECT * FROM tbl LIMIT 5,10; #檢索行6-15

http://dev.mysql.com/doc/refman/5.0/en/select.html

另外,我覺得你正在尋找30名的網頁,以便您的查詢應該使用30作爲限制條款中的第二個參數。

SELECT * 
FROM  table 
LIMIT  20, 30; 

SELECT * 
FROM  table 
LIMIT  6000000, 30; 
+0

第二個參數可能是一個促成因素,因爲查詢實際上會返回更多的行..我不認爲它公平地說這不能提供答案..他的回答是返回bajillion行需要更長的時間..它可能是部分正確的。 –

+0

好的...所以那個範圍內的記錄也被解析或跳過?我認爲他們被解析要麼沒有差異,而存在差異,對吧?與行數相比, – sbaaaang

+0

偏移量很小。 \t 我在挖掘參考文獻 – dotjoe