語法:
*** limit [offset,] rows
一般是用於select語句中用以從結果集中拿出特定的一部分數據。
offset是偏移量,表示我們現在需要的數據是跳過多少行數據之後的,可以忽略;rows表示我們現在要拿多少行數據。
2.例子:
①select * from mytbl limit 10000,100
上邊SQL語句表示從表mytbl中拿數據,跳過10000行之後,拿100行
②select * from mytbl limit 0,100
表示從表mytbl拿數據,跳過0行之後,拿取100行
③select * from mytbl limit 100
這條SQL跟②的效果是完全一樣的,表示拿前100條數據
④爲了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數爲 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last
3.用處:
我目前用到的地方是數據庫查詢分頁,比如前臺要展示數據庫中數據,需要後臺實現分頁,傳入數據要有“頁碼page”跟“每頁數據條數nums”。
對應SQL大概是這樣子:select * from mytbl order by id limit (page-1)*nums,nums
4.問題發現:
在數據量不大或者是大數據量的前幾頁的時候,性能還算不壞,但是大數據量頁碼稍微大一點性能便下降比較嚴重。
5.問題分析:
原因出在Limit的偏移量offset上,比如limit 100000,10雖然最後只返回10條數據,但是偏移量卻高達100000,數據庫的操作其實是拿到100010數據,然後返回最後10條。
那麼解決思路就是,我能不能跳過100000條數據然後讀取10條,而不是讀取100010條數據然後返回10條數據。
6.問題解決實現:
原SQL語句如下:select *from mytbl order by id limit 100000,10
改進後的SQL語句如下:
select *from
mytbl
where id>=
(
select id from mytbl order by id limit 100000,1
)
limit 10
注:假設id是主鍵索引,那麼裏層走的是索引,外層也是走的索引,所以性能大大提高