MySQL技巧:做好Limit優(yōu)化
我們?cè)诓樵償?shù)據(jù)時(shí),往往需要指定返回幾行數(shù)據(jù)。如現(xiàn)在有一個(gè)B/S架構(gòu)的應(yīng)用程序,其每一頁可能只顯示30條記錄。此時(shí)為了提高顯示的效率,一般就要求數(shù)據(jù)庫一次只返回三十條紀(jì)錄。等用戶按下一頁的時(shí)候,再從數(shù)據(jù)庫中返回30條記錄,以此類推。這可以縮短數(shù)據(jù)顯示的時(shí)間。當(dāng)查詢的基表比較大時(shí),這個(gè)措施非常有效。此時(shí)可以使用Limit關(guān)鍵字來實(shí)現(xiàn)這個(gè)需求。Limit子句可以被用于強(qiáng)制Select查詢語句返回指定的記錄數(shù)量。
通常情況下,Limit關(guān)鍵字可以接受一個(gè)或者兩個(gè)數(shù)字參數(shù)。需要注意的是,這個(gè)參數(shù)必須是一個(gè)整數(shù)常量。如果用戶給定兩個(gè)參數(shù),則第一個(gè)參數(shù)表示第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)則表示返回記錄行的最大數(shù)據(jù)。另外需要提醒的是,初始記錄行的偏移量是0,而不是1。不少用戶會(huì)在這里犯錯(cuò)誤。
雖然使用了Limit語句來限制返回的記錄數(shù),從而可以提高應(yīng)用程序的工作效率。但是其也會(huì)給系統(tǒng)的性能帶來一些負(fù)面影響。如可能會(huì)導(dǎo)致全表掃描等等。為此筆者給出一些Limit關(guān)鍵字的優(yōu)化的建議,以供大家參考。
建議一:靈活使用Limit 0子句
根據(jù)Limit關(guān)鍵字的定義,如果參數(shù)為0的話,則其返回的是空記錄。這看起來好像沒有多少的意義。其實(shí)不然。在實(shí)際工作中,靈活使用這個(gè)0參數(shù),能夠給我們帶來很大的收獲。
如現(xiàn)在數(shù)據(jù)庫工程師想要確認(rèn)一下某個(gè)查詢語句的有效性,如果直接運(yùn)行這個(gè)查詢語句,需要等待其返回的記錄。如果涉及的紀(jì)錄數(shù)量比較多,或者運(yùn)算邏輯比較復(fù)雜,那么需要等到比較長的時(shí)間。此時(shí)就可以在Select查詢語句中,使用Limit 0子句。只要查詢語句沒有語法上的錯(cuò)誤,這就可以讓數(shù)據(jù)庫快速的返回一個(gè)空集合。從而幫助數(shù)據(jù)庫設(shè)計(jì)人員迅速的判斷查詢語句的有效性。另外這個(gè)空集和中還會(huì)返回某個(gè)表的各個(gè)字段的數(shù)據(jù)類型。即通過這個(gè)Limit 0子句還可以查詢某個(gè)表的表結(jié)構(gòu)。
可見靈活應(yīng)用Limir 0子句,確實(shí)能夠給我們帶來不小的收益。不過需要注意的是,在某些特定的場(chǎng)合下,這個(gè)子句可能不會(huì)奏效。如通常情況下,在Monitor工作環(huán)境中不支持這個(gè)Limit 0子句。此時(shí)結(jié)果只會(huì)顯示Empty Set,而不是我們所需要的結(jié)果。
建議二:Limit與Group By結(jié)合使用
Group By關(guān)鍵字主要用來對(duì)數(shù)據(jù)進(jìn)行分類匯總。不過在分類匯總之前,往往需要對(duì)數(shù)據(jù)先進(jìn)性排序。而Limit語句用來指定顯示的結(jié)果數(shù)量時(shí),往往也需要涉及到紀(jì)錄的分類匯總與排序的問題。如現(xiàn)在一個(gè)學(xué)校成績管理系統(tǒng)中,需要對(duì)學(xué)生的總分進(jìn)行排序。即先對(duì)學(xué)生各科成績進(jìn)行匯總,然后顯示其排名為前50的紀(jì)錄。此時(shí)就需要同時(shí)用到Group By子句和Limit子句。其實(shí)從這個(gè)案例中我們也可以看出,這兩個(gè)子句相互依賴的特性。正是因?yàn)檫@種特性(經(jīng)常相互結(jié)合使用),為此結(jié)合Group By子句可以提高Limit的查詢效率。
這主要是因?yàn)閮烧呷绻黄鹗褂玫脑挘琇imit關(guān)鍵字將不會(huì)再重復(fù)計(jì)算任何不必要的Group By的值。換句話說,在某些情況下,Group By子句能夠通過順序來讀取鍵或者在鍵上做排序來解決分類匯總時(shí)的排序問題,然后再計(jì)算摘要直到關(guān)鍵字的值的改變?yōu)橹埂H绱说脑挘瑑蓚(gè)子句所需要做的一些共同性的工作,只要做一次即可。這就可以從另外一次角度用來提高應(yīng)用系統(tǒng)的性能。相比先做一個(gè)視圖對(duì)數(shù)據(jù)進(jìn)行分類匯總的運(yùn)算,再使用一個(gè)查詢語句來抽取特定數(shù)量的記錄,效率就要高一點(diǎn)。因?yàn)楹笳呤菍蓚(gè)子句分開來使用,就無法享受到結(jié)合使用所體現(xiàn)的優(yōu)勢(shì)。
關(guān)健詞:Limit優(yōu)化
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解