mysql使用limit分頁,當limit offset,rows的offset數值過大時,會出現效率問題。
正常查詢:
查詢三次,時間分別是0.684s,0.901s,0.708s.
執行計畫,走的range索引。
查詢三次,耗時分別為0.151s,0.401s,0.211s。
為什麼這樣寫可以提高效率?
select * from t_bank where bank_code like 『0%』 limit 145000,5; 的查詢過程:
找到非聚簇索引葉子節點上的主鍵值;
根據主鍵值去聚簇索引上查詢需要的全部字段值。
由此可以看出,非聚簇索引的查詢有兩個過程。而limit查詢,偏移的所有資料,都會走著兩個過程。如果只查id,就可以省略第2個步驟。
為了證實select * from t_bank where bank_code like 『0%』 limit 145000,5是掃瞄了145005個索引節點和145005個聚簇索引節點,只能用間接的方法來證明。
innodb有個buffer pool,裡面存有最近訪問的資料頁,包括資料頁和索引頁。我們需要執行兩個sql,比較buffer pool裡資料頁的數量即可得到結果。
mysql> select index_name,count(*) from information_schema.innodb_buffer_page where index_name in('val','primary') and table_name like '%test%' group by index_name;
遇到的問題
為了在每次重啟時確保清空buffer pool,我們需要關閉innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup,這兩個選項能夠控制資料庫關閉時dump出buffer pool中的資料和在資料庫開啟時載入在磁碟上備份buffer pool的資料。
mysql分頁limit 優化
mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset和length比較大的時候,mysql明顯效能下降 1.子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的數 缺點 資料必須是連續的,可以說不能有where條件,where條...
MySql分頁limit 優化
mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset比較大的時候,mysql明顯效能下降 1.子查詢優化法 mysql set profiling 1 query ok,0 rows affected 0.00 sec mysql select ...
limit分頁優化
對於有大資料量的mysql表來說,使用limit分頁存在很嚴重的效能問題。查詢從第1000000之後的30條記錄 sql 1 平均用時6.6秒 select from cdb posts order by pid limit 1000000 30 sql 2 平均用時0.6秒 select from...