MySQL的limit用法和分頁查詢語句的性能分析詳解

本篇文章主要介紹了詳解mysqlmysqlmysqlmysql語句的性能分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

limit用法

在我們使用查詢語句的時(shí)候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個(gè)時(shí)候怎么辦呢?不用擔(dān)心,mysql已經(jīng)為我們提供了這樣一個(gè)功能。

SELECT?*?FROM?table?LIMIT?[offset,]?rows?|?rows?OFFSET?offset

LIMIT 子句可以被用于強(qiáng)制 SELECT 語句返回指定的記錄數(shù)。LIMIT 接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)mysqlmysql。如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql>?SELECT?*?FROM?table?LIMIT?5,10;?//?檢索記錄行?6-15

為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1:

mysql>?SELECT?*?FROM?table?LIMIT?95,-1;?//?檢索記錄行?96-last.

如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目:?

mysql>?SELECT?*?FROM?table?LIMIT?5;?//檢索前?5?個(gè)記錄行

換句話說,LIMIT n 等價(jià)于 LIMIT 0,n。

Mysql的分頁查詢語句的性能分析

MySql分頁sql語句,如果和MSSQL的mysql語法相比,那么MySQL的LIMIT語法要顯得優(yōu)雅了許多。使用它來分頁是再自然不過的事情了。

最基本的分頁方式:

SELECT?...?FROM?...?WHERE?...?ORDER?BY?...?LIMIT?...

在中小數(shù)據(jù)量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了mysql:舉例來說,如果實(shí)際SQL類似下面語句,那么在category_id, id兩列上建立復(fù)合索引比較好:

代碼如下:

SELECT?*?FROM?articles?WHERE?category_id?=?123?ORDER?BY?id?LIMIT?50,?10

子查詢的分頁方式:

隨著數(shù)據(jù)量的增加,頁數(shù)會(huì)越來越多,查看后幾頁的SQL就可能類似:

代碼如下:

SELECT?*?FROM?articles?WHERE?category_id?=?123?ORDER?BY?id?LIMIT?10000,?10

一言以蔽之,就是越往后分頁,LIMIT語句的偏移量就會(huì)越大,速度也會(huì)明顯變慢。

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

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?<p>經(jīng)過我的測試,join分頁和子查詢分頁的效率基本在一個(gè)等級(jí)上,消耗的時(shí)間也基本一致。 explain SQL語句:</p><pre class="brush:sql;">id?select_type?table?type?possible_keys?key?key_len?ref?rows?Extra  1?PRIMARY?<derived2>?system?NULL?NULL?NULL?NULL?1?  1?PRIMARY?t1?range?PRIMARY?PRIMARY?4?NULL?6264?Using?where  2?DERIVED?content?index?NULL?PRIMARY?4?NULL?27085?Using?index</derived2>

為什么會(huì)這樣呢?因?yàn)樽硬樵兪窃谒饕贤瓿傻模胀ǖ牟樵儠r(shí)在數(shù)據(jù)文件上完成的,通常來說,索引文件要比數(shù)據(jù)文件小得多,所以操作起來也會(huì)更有效率。

實(shí)際可以利用類似mysql的方式去處理分頁,比如判斷如果是一百頁以內(nèi),就使用最基本的分頁方式,大于一百頁,則mysql的分頁方式。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享