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
SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) LIMIT M對象
適用於數據量多的狀況(元組數上萬)
索引掃描,速度會很快. 有朋友提出: 由於數據查詢出來並非按照pk_id排序的,因此會有漏掉數據的狀況,只能方法二。排序
SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M索引
適用於數據量多的狀況(元組數上萬). 最好ORDER BY後的列對象是主鍵或惟一因此,使得ORDERBY操做能利用索引被消除但結果集是穩定的。it
這種方式先定位偏移位置的 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
若是表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