MySQL技巧:做好Limit優化

  我們在查詢數據時,往往需要指定返回幾行數據。如現在有一個B/S架構的應用程序,其每一頁可能隻顯示30條記錄。此時為瞭提高顯示的效率,一般就要求數據庫一次隻返回三十條紀錄。等用戶按下一頁的時候,再從數據庫中返回30條記錄,以此類推。這可以縮短數據顯示的時間。當查詢的基表比較大時,這個措施非常有效。此時可以使用Limit關鍵字來實現這個需求。Limit子句可以被用於強制Select查詢語句返回指定的記錄數量。

  通常情況下,Limit關鍵字可以接受一個或者兩個數字參數。需要註意的是,這個參數必須是一個整數常量。如果用戶給定兩個參數,則第一個參數表示第一個返回記錄行的偏移量,第二個參數則表示返回記錄行的最大數據。另外需要提醒的是,初始記錄行的偏移量是0,而不是1。不少用戶會在這裡犯錯誤。

  雖然使用瞭Limit語句來限制返回的記錄數,從而可以提高應用程序的工作效率。但是其也會給系統的性能帶來一些負面影響。如可能會導致全表掃描等等。為此筆者給出一些Limit關鍵字的優化的建議,以供大傢參考。

  建議一:靈活使用Limit 0子句

  根據Limit關鍵字的定義,如果參數為0的話,則其返回的是空記錄。這看起來好像沒有多少的意義。其實不然。在實際工作中,靈活使用這個0參數,能夠給我們帶來很大的收獲。

  如現在數據庫工程師想要確認一下某個查詢語句的有效性,如果直接運行這個查詢語句,需要等待其返回的記錄。如果涉及的紀錄數量比較多,或者運算邏輯比較復雜,那麼需要等到比較長的時間。此時就可以在Select查詢語句中,使用Limit 0子句。隻要查詢語句沒有語法上的錯誤,這就可以讓數據庫快速的返回一個空集合。從而幫助數據庫設計人員迅速的判斷查詢語句的有效性。另外這個空集和中還會返回某個表的各個字段的數據類型。即通過這個Limit 0子句還可以查詢某個表的表結構。

  可見靈活應用Limir 0子句,確實能夠給我們帶來不小的收益。不過需要註意的是,在某些特定的場合下,這個子句可能不會奏效。如通常情況下,在Monitor工作環境中不支持這個Limit 0子句。此時結果隻會顯示Empty Set,而不是我們所需要的結果。

  建議二:Limit與Group By結合使用

  Group By關鍵字主要用來對數據進行分類匯總。不過在分類匯總之前,往往需要對數據先進性排序。而Limit語句用來指定顯示的結果數量時,往往也需要涉及到紀錄的分類匯總與排序的問題。如現在一個學校成績管理系統中,需要對學生的總分進行排序。即先對學生各科成績進行匯總,然後顯示其排名為前50的紀錄。此時就需要同時用到Group By子句和Limit子句。其實從這個案例中我們也可以看出,這兩個子句相互依賴的特性。正是因為這種特性(經常相互結合使用),為此結合Group By子句可以提高Limit的查詢效率。

  這主要是因為兩者如果一起使用的話,Limit關鍵字將不會再重復計算任何不必要的Group By的值。換句話說,在某些情況下,Group By子句能夠通過順序來讀取鍵或者在鍵上做排序來解決分類匯總時的排序問題,然後再計算摘要直到關鍵字的值的改變為止。如此的話,兩個子句所需要做的一些共同性的工作,隻要做一次即可。這就可以從另外一次角度用來提高應用系統的性能。相比先做一個視圖對數據進行分類匯總的運算,再使用一個查詢語句來抽取特定數量的記錄,效率就要高一點。因為後者是將兩個子句分開來使用,就無法享受到結合使用所體現的優勢。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *