MySQL limit 效能分析

2021-09-25 02:14:53 字數 2900 閱讀 5809

**limit用法

mysql的分頁查詢語句的效能分析

對於有大資料量的mysql表來說,使用limit分頁存在很嚴重的效能問題。

有彩蛋哦!!!

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

select * from table limit [offset,

] rows | `rows offset offset `

(limit offset, `length`)

select

*from table

where condition1 =

0and condition2 =

0and condition3 =-1

and condition4 =-1

order by id asc

limit 2000 offset 50000

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 =

123 order by id limit 50,10

子查詢的分頁方式:

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

select * from articles where category_id =

123 order by id limit 10000,10

總的來說,就是越往後分頁,limit語句的偏移量就會越大,速度也會明顯變慢。

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

select * from articles where id >=

(select id from articles where category_id =

123 order by id limit 10000,1

) limit 10

join分頁方式

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分頁和子查詢分頁的效率基本在乙個等級上,消耗的時間也基本一致。

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

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

查詢從第1000000之後的30條記錄:

sql**1:平均用時6.6秒 select * from `cdb_posts` order by pid limit 1000000,30

sql**2:平均用時0.6秒 select * from `cdb_posts` where pid >=

(select pid from

`cdb_posts` order by pid limit 1000000,1

) limit 30

因為要取出所有字段內容,第一種需要跨越大量資料塊並取出,而第二種基本通過直接根據索引字段定位後,才取出相應內容,效率自然大大提公升。對limit的優化,不是直接使用limit,而是首先獲取到offset的id,然後直接使用limit size來獲取資料。

可以看出,越往後分頁,limit語句的偏移量就會越大,兩者速度差距也會越明顯。

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

優化思想:避免資料量大時掃瞄過多的記錄

為了保證index索引列連續,可以為每個表加乙個自增字段,並且加上索引

MySQL limit用法及效能分析

在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料 分頁 這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣乙個功能。具體語法 select from table limit offset,rows rows offset offsetlimit 子句可以被用於強制 select ...

mysql limit效能問題

我們通常使用limit進行分頁查詢 select from table name where val 4 order by id limit 100,10 當偏移量很大時,會遇到效能問題 select from table name where val 4 order by id limit 100...

MYSQL LIMIT 效能測試

普通表 select from test page limit m,n 記憶體表 select from test page memory limit m,n查詢位置 offset,size 普通表 查詢時間 記憶體表 查詢時間 100,100 0.004s 0.001s 1000,100 0.00...