sql limit order by and where


1 sql limit

limit size,返回前size行。

limit offset , size,返回offset開始的size行,offset從0行開始。

2 sql limit with where

where先對基礎數據按行進行過濾,然后limit操作在這個經過過濾的數據基礎至上。

3 sql limit with order by

對基礎數據進行排序,然后再進行limit操作,這樣保證返回的結果的順序確定。

用了order by返回的結果也不是確定的,如果是基於非唯一字段排序的,那么返回的結果也可能不一樣,要確定一樣,那么就要基於唯一性字段排序。

用了limit的order by不會全表排序的,它會全表掃描,然后找到前n大的后就直接返回了,如果是索引列的話,因為已經排好序了,就會非常快了。

如果非唯一字段排序,但是要求結果一致的話,可以采用下面的辦法:

可以額外加一個排序條件。例如id字段是唯一的,可以考慮在排序字段中額外加個id排序去確保順序穩定。

所以上面的情況下可以在SQL再添加個排序字段,比如fund_flow的id字段,這樣分頁的問題就解決了。修改后的SQL可以像下面這樣:
SELECT * FROM user ORDER BY create_time,id LIMIT 6,2;

4 sql limit without order by

返回的結果的順序不是固定的,但是結果是一致的,只要原始數據不變化。

5 大表時提高limit的效率

select * from product limit 866613, 20   37.44秒

limit語句的查詢時間與起始記錄的位置成正比,因為需要從頭開始遍歷整個表來找到866613的位置。

解決辦法:

使用索引,幫助sql引擎找到866613的位置。使用覆蓋索引,即只包含索引的列。

select id from product limit 866613, 20 0.2秒

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

或者使用join

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.id = b.id

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM