


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