Mysql的limit用法與幾種分頁(yè)形式

1、mysql的limit用法

?

在我們使用查詢語(yǔ)句的時(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 語(yǔ)句返回指定的記錄數(shù)。LIMIT 接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。如果給定兩個(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è)記錄行 ?

??

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

?

【引用,路人乙:Mysql中l(wèi)imit的用法詳解】

?

2、Mysql的分頁(yè)查詢語(yǔ)句的性能分析

?

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

?

2.1最基本的分頁(yè)方式:

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

??

在中小數(shù)據(jù)量的情況下,這樣的SQL足夠用了,唯一需要注意的問(wèn)題就是確保使用了索引:

舉例來(lái)說(shuō),如果實(shí)際SQL類似下面語(yǔ)句,那么在category_id, id兩列上建立復(fù)合索引比較好:

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

??

2.2子查詢的分頁(yè)方式:

?

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

Sql代碼 ?收藏代碼

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

??

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

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

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

?

2.3JOIN分頁(yè)方式

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)過(guò)我的測(cè)試,join分頁(yè)和子查詢分頁(yè)的效率基本在一個(gè)等級(jí)上,消耗的時(shí)間也基本一致。</p><p>explain SQL語(yǔ)句:</p><pre class="brush:php;toolbar:false">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ù)文件上完成的,通常來(lái)說(shuō),索引文件要比數(shù)據(jù)文件小得多,所以操作起來(lái)也會(huì)更有效率。

?

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

以上就是Mysql的limit用法與幾種分頁(yè)形式的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

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