不,這不是什麼LIMIT
呢。子句LIMIT
作爲語句執行的最後一步,聚合之後,HAVING子句之後和排序之後應用。
我無法理解一個用例,它需要您描述的功能類型。
隨訪
是戈登·利諾夫提供的服務將返回指定的結果,只要有在myTable
至少一行滿足謂詞查詢。否則,它將返回零行。
這裏的EXPLAIN輸出戈登的查詢:
id select_type table type key rows Extra
-- ------------ ---------------- ----- ------- ---- -------------------------------
1 PRIMARY <derived2> ALL 5 Using temporary; Using filesort
1 PRIMARY <derived3> ALL 5 Using join buffer
3 DERIVED No tables used
4 UNION No tables used
5 UNION No tables used
6 UNION No tables used
7 UNION No tables used
UNION RESULT <union3,4,5,6,7> ALL
2 DERIVED myTable range PRIMARY 10 Using where; Using index
下面是原始查詢的EXPLAIN輸出:
id select_type table type key rows Extra
-- ----------- ----------------- ----- ------- ---- -------------------------------
1 SIMPLE myTable range PRIMARY 10 Using where; Using index
這似乎只是它會是一個整批莫如果該結果集包含少於五個(且多於零)的行,則重新高效地以重新處理來自原始查詢的結果集。 (當行數從5增加到1000或150,000時,它會更加奇怪。)
從結果集中獲取行的多個副本的代碼非常簡單:獲取行,以及如果結果集在獲取五行(或N個)之前已達到,然後將行指針重置回第一行,因此下一次獲取將再次返回第一行。在使用mysqli
PHP,例如,你可以使用:
$result->data_seek(0);
或者,對於那些仍然使用過時的mysql_
接口:
mysql_data_seek($result,0);
但如果你只返回五行,很可能你甚至沒有循環遍歷結果,並且您已經將所有行填入數組中。只需循環回數組的開頭。
對於不支持可滾動遊標的MySQL接口,我們只保存整個結果集並多次處理。使用Perl DBI,使用fetchall_arrayref
和JDBC(它將把整個結果集存儲在內存中,而無需對連接進行特殊設置),我們會將結果集存儲爲一個對象。底線,將這個要求(產生一個正好五行的結果集)壓回數據庫服務器,並拉回行的重複副本和/或在內存中存儲行的重複副本看起來像是錯誤的滿足用例的方式。 (如果有理由在內存中存儲行的重複副本,那麼可以在不將數據庫的行重複副本從數據庫中取回的情況下實現。)
您說您正在使用/實現「循環緩衝區「,但是您選擇不要繞回到包含少於五行的結果集的開頭,而是需要讓MySQL返回重複的行。非常非常奇怪。
雖然我覺得這個問題非常不尋常,但我沒有看到任何值得投票的事情。 –
我不明白爲什麼我的問題有投票權。 –