MySQL 分頁的幾種有用的方法
阿新 • • 發佈:2021-08-20
MySQL 分頁的幾種有用的方法
方法1: 使用 LIMIT
SELECT * FROM 表名稱 LIMIT M,N
或者寫成:limit start, count
特點: 簡單,使用方便,但,是全表掃描,資料多的清下下速度會偏慢 ,且有的資料庫結果集返回不穩定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是從結果集的M位置處取出N條輸出,其餘拋棄.
方法2: 建立主鍵或唯一索引, 利用索引(假設每頁10條)
SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) LIMIT M
適應場景: 適用於資料量多的情況(元組數上萬)
特點: 索引掃描,速度會很快. 資料是基於pk_id排序
方法3: 基於索引再排序
SELECT * FROM 表名稱 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M
//
SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20
特點: 索引掃描,速度會很快. 但MySQL的排序操作,ASC還好,但DESC排序尚未穩定。
利用子查詢示例:
SELECT * FROM your_table WHERE id <=(SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc LIMIT $pagesize
SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
利用 JOIN 連線示例:
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
方法4: 基於索引使用prepare
PREPARE stmt_name FROM SELECT * FROM 表名稱 WHERE id_pk > (?* ?) ORDER BY id_pk ASC LIMIT M
第一個問號表示pageNum,第二個?表示每頁元組數
特點:適應於大資料量的情況,索引掃描,速度會很快. prepare語句比一般的查詢語句快一點。
方法5:複合索引優化search( 欄位1,欄位2 )
select id,title from 表名 limit 1000,10;
建立 search(vtype,id) 索引,示例:
select id from 表名 where vtype=1 limit 90000,10;
注意:where 條件,走索引limit,將where 放第一位,limit用到的主鍵放第2位,select 主鍵
建立時間:2021.08.18 更新時間:
部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!