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