2011-06-11 26 views
13

我有一個28,900的MyISAM表。我正在處理它在1500塊,這樣的查詢:極限偏移量,長度是否需要ORDER BY分頁?

SELECT * FROM table WHERE id>0 LIMIT $iStart,1500 

然後,我循環這一點,每次增加$ iStart 1500。

問題是在某些情況下查詢返回相同的行。例如,LIMIT 0,1500查詢將返回一些與LIMIT 28500,1500查詢相同的行。

如果我沒有對行進行排序,我不希望使用LIMIT進行分頁嗎?

(當這些查詢發生時,表格是靜態的,沒有其他查詢會發生,這會改變它的行)。

回答

16

與其他所有SQL引擎一樣,MySQL MyISAM表不會保證返回行的順序,除非指定了ORDER BY子句。通常,它們返回的順序將是它們從文件系統中讀取的順序,根據更新,刪除甚至緩存選擇的狀態,順序可能會從查詢更改爲查詢。

如果您想避免讓同一行返回多次,那麼您必須按照某種順序排列,主鍵是最明顯的候選項。

+0

爲了擴大這一點,我已經看到了innodb表發生的這種情況,並且結果不一定在文件系統順序中,+1表示「你必須按某種東西排序」。 – ChrisInEdmonton 2012-07-24 01:34:45

7

您應該使用ORDER BY來確保一致的順序。否則,DBMS可以以任意順序返回行(但是,如果沒有行被修改,則可以假定它是任意的但在查詢之間一致)。

+2

如果沒有行被修改,查詢之間不一致,至少用innodb。大體一致,這幾乎更糟糕。 :( – ChrisInEdmonton 2012-07-24 01:35:19

+0

永遠不要做這個假設 – 2017-06-09 09:56:35

相關問題