1. 程式人生 > 其它 >MySQL 分頁的幾種有用的方法

MySQL 分頁的幾種有用的方法

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 希望內容對你所有幫助,謝謝!