MySQL分頁limit速度太慢的優化方法

2022-03-28 10:23:11 字數 2407 閱讀 4406

在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣乙個功能。

select

*from

table limit [

offset,

] rows | rows offset offset

limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 相容,mysql 也支援句法: limit # offset #。

mysql>

select

*from

table limit 5,10; // 檢索記錄行 6

-15

為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:

mysql>

select

*from

table limit 95,-

1; // 檢索記錄行 96

-last.

如果只給定乙個引數,它表示返回最大的記錄行數目: 

mysql>

select

*from

table limit 5; //檢索前 5 個記錄行

換句話說,limit n等價於limit 0,n

mysql分頁sql語句,如果和mssql的top語法相比,那麼mysql的limit語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。

select ... from ... where ... order

by ... limit ...

在中小資料量的情況下,這樣的sql足夠用了,唯一需要注意的問題就是確保使用了索引:舉例來說,如果實際sql類似下面語句,那麼在category_id, id兩列上建立復合索引比較好:

select

*from articles where category_id =

123order

by id limit 50, 10

隨著資料量的增加,頁數會越來越多,檢視後幾頁的sql就可能類似:

select

*from articles where category_id =

123order

by id limit 10000, 10

一言以蔽之,就是越往後分頁,limit語句的偏移量就會越大,速度也會明顯變慢

此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:

select

*from articles where id >=

(select id from articles where category_id =

123order

by id limit 10000, 1) limit 10

select

*from `content` as

t1 join (select id from `content` order

by id desc limit ".($page-

1)*$pagesize.", 1) as

t2 where t1.id <= t2.id order

by t1.id desc limit $pagesize;

經過我的測試,join分頁和子查詢分頁的效率基本在乙個等級上,消耗的時間也基本一致。 explain sql語句:

id select_type table type possible_keys key

key_len ref rows extra

1primary

system null

null

null

null11

primary t1 range primary

primary

4null

6264 using where

2 derived content index

null

primary

4null

27085 using index

為什麼會這樣呢?因為子查詢是在索引上完成的,而普通的查詢時在資料檔案上完成的,通常來說,索引檔案要比資料檔案小得多,所以操作起來也會更有效率。

實際可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。

MYSQL分頁limit速度太慢優化方法

limit10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡 利用表的覆蓋索引來加速分頁查詢 我們都知道,利用了索引查詢的語句中如果只包含了那個索引列 覆蓋索引 那麼這種情況會查詢很快。在我們的例子中,我們知道id欄位是主鍵,自然就包含了預設的主...

mysql分頁limit 優化

mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset和length比較大的時候,mysql明顯效能下降 1.子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的數 缺點 資料必須是連續的,可以說不能有where條件,where條...

Mysql分頁LIMIT分析

表結構 select id from table limit 2,4 返回結果 3,4,5,6 select id from table limit 3,4 返回結果 4,5,6,7 select id from table limit 3,5 返回結果 4,5,6,7,8 由以上結果可分析得到論 ...