limit常用於分頁處理,時長會伴隨order by從句使用,因此大多時候回使用filesorts這樣會造成大量的io問題。
例子:需求:查詢影片id和描述資訊,並根據主題進行排序,取出從序號50條開始的5條資料。
select film_id,description from sakila.film order by title limit 50,5;
執行的結果:
在檢視一下它的執行計畫:
對於這種操作,我們該用什麼樣的優化方式了?
優化步驟1:
使用有索引的列或主鍵進行order by操作,因為大家知道,innodb是按照主鍵的邏輯順序進行排序的。可以避免很多的io操作。
檢視一下執行計畫
那如果我們獲取從500行開始的5條記錄,執行計畫又是什麼樣的了?
隨著我們翻頁越往後,io操作會越來越大的,如果乙個表有幾千萬行資料,翻頁越後面,會越來越慢,因此我們要進一步的來優化。
優化步驟2
記錄上次返回的主鍵, 在下次查詢時使用主鍵過濾。(說明:避免了資料量大時掃瞄過多的記錄)
上次limit是50,5的操作,因此我們在這次優化過程需要使用上次的索引記錄值,
select film_id,description from sakila.film where film_id >55 and film_id<=60 order by film_id limit 1,5;
檢視執行計畫:
結論:掃瞄行數不變,執行計畫是很固定,效率也是很固定的
注意事項:
主鍵要順序排序並連續的,如果主鍵中間空缺了某一列,或者某幾列,會出現列出資料不足5行的資料;如果不連續的情況,建立乙個附加的列index_id列,保證這一列資料要自增的,並新增索引即可。
Limit分頁查詢效能優化
1.語法 limit offset,rows 一般是用於select語句中用以從結果集中拿出特定的一部分資料。offset是偏移量,表示我們現在需要的資料是跳過多少行資料之後的,可以忽略 rows表示我們現在要拿多少行資料。2.栗子 select from mytbl limit 10000,100...
查詢 limit優化
一種情況,limit接受乙個引數,即是返回記錄的前面最大行數 另一情況,limit接受兩個引數,乙個是返回記錄行的偏移量,乙個是返回記錄行的最大數量 用法1 limit rows select from user order by id limit 5 返回記錄的前5行。用法2 limit offs...
limit 優化查詢
假設有如下sql語句 select from table1 limit offset,rows這是一條典型的limit語句,常見的使用場景是,某些查詢返回的內容特別多,而客戶端處理能力有限,希望每次只取一部分結果進行處理。上述sql語句的實現機制是 從 table 表中讀取offset rows行記...