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)!