MySql 分頁查詢優化

mysql> select count(1) from sys_log;
+----------+
| count(1) |
+----------+
|    22589 |
+----------+mysql

mysql>  select * from sys_log  order by create_date desc limit 20000,10 ;
//省卻....
10 rows in set (2.79 sec)sql

limit 20000,10,此時MySql會篩選出前20010條記錄,而僅僅返回 20000-20010之間的10條記錄。前20000條記錄會被拋棄,查詢效率很低。spa

1、利用索引

SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) LIMIT M對象

適用於數據量多的狀況(元組數上萬)
索引掃描,速度會很快. 有朋友提出: 由於數據查詢出來並非按照pk_id排序的,因此會有漏掉數據的狀況,只能方法二。排序

2、基於索引再排序

SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M索引

適用於數據量多的狀況(元組數上萬). 最好ORDER BY後的列對象是主鍵或惟一因此,使得ORDERBY操做能利用索引被消除但結果集是穩定的。it


3、使用子查詢

這種方式先定位偏移位置的 id,而後日後查詢,這種方式適用於 id 遞增的狀況。
select * from orders_history where type=8 limit 100000,1;
select id from orders_history where type=8 limit 100000,1;
select * from orders_history where type=8 and id>=(select id from orders_history where type=8 limit 100000,1) limit 100;
select * from orders_history where type=8 limit 100000,100;效率

4條語句的查詢時間以下:
第1條語句:3674ms
第2條語句:1315ms
第3條語句:1327ms
第4條語句:3710msdate

4、使用鏈接查詢

若是表ID非數字遞增的狀況
mysql> select a.* from sys_log a INNER JOIN (select id from sys_log order by create_date desc limit 20000,10 ) b on a.id=b.id;
//省卻....
10 rows in set (0.12 sec)select

相關文章
相關標籤/搜索