MySql分頁limit 優化

2021-09-30 03:18:04 字數 2627 閱讀 5433

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...