mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset比較大的時候,mysql明顯效能下降
1.子查詢優化法
mysql> set profiling=1;
query ok, 0 rows affected (0.00 sec)
mysql> select count(*) from member;
| count(*) |
| 169566 |
1 row in set (0.00 sec)
mysql> pager grep !~-
pager set to 'grep !~-'
mysql> select * from member limit 10, 100;
100 rows in set (0.00 sec)
mysql> select * from member where memberid >= (select memberid from member limit 10,1) limit 100;
100 rows in set (0.00 sec)
mysql> select * from member limit 1000, 100;
100 rows in set (0.01 sec)
mysql> select * from member where memberid >= (select memberid from member limit 1000,1) limit 100;
100 rows in set (0.00 sec)
mysql> select * from member limit 100000, 100;
100 rows in set (0.10 sec)
mysql> select * from member where memberid >= (select memberid from member limit 100000,1) limit 100;
100 rows in set (0.02 sec)
mysql> nopager
pager set to stdout
mysql> show profiles/g
*************************** 1. row ***************************
query_id: 1
duration: 0.00003300
query: select count(*) from member
*************************** 2. row ***************************
query_id: 2
duration:0.00167000
query: select * from member limit 10, 100
*************************** 3. row ***************************
query_id: 3
duration: 0.00112400
query: select * from member where memberid >= (select memberid from member limit 10,1) limit 100
*************************** 4. row ***************************
query_id: 4
duration:0.00263200
query: select * from member limit 1000, 100
*************************** 5. row ***************************
query_id: 5
duration:0.00134000
query: select * from member where memberid >= (select memberid from member limit 1000,1) limit 100
*************************** 6. row ***************************
query_id: 6
duration: 0.09956700
query: select * from member limit 100000, 100
*************************** 7. row ***************************
query_id: 7
duration:0.02447700
query: select * from member where memberid >= (select memberid from member limit 100000,1) limit 100
從結果中可以得知,當偏移1000以上使用子查詢法可以有效的提高效能。
但是,子查詢法限制比較大,只能是在沒有where的情況下使用,能用到的機會比較少。可以作為一種思路
2.倒排表優化法
倒排表法就是建立索引,用一張表來維護頁數,然後通過高效的連線得到資料
mysql分頁limit 優化
mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset和length比較大的時候,mysql明顯效能下降 1.子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的數 缺點 資料必須是連續的,可以說不能有where條件,where條...
MySql分頁limit優化
mysql使用limit分頁,當limit offset,rows的offset數值過大時,會出現效率問題。正常查詢 查詢三次,時間分別是0.684s,0.901s,0.708s.執行計畫,走的range索引。查詢三次,耗時分別為0.151s,0.401s,0.211s。為什麼這樣寫可以提高效率?s...
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...