本篇文章主要介紹了詳解mysql的mysql和mysqlmysql語句的性能分析,具有一定的參考價(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的分頁方式。