這篇文章帶給大家的內容是關於SQL效能優化提升的方法介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
Ø 簡單的效能最佳化
Sql的效能最佳化是資料庫工程師在實際工作中必須面對的重要課題之一。對某些資料庫工程師來說,它幾乎唯一的命題。實際上,像WEB服務這樣需要快速回應的應用程式場景中,SQL的效能直接決定了系統是否可以使用。這裡主要介紹一些使用SQL執行速度更快,消耗記憶體更少的最佳化技巧,今天的文章只介紹其中的一種,後續會繼續更新一些它的最佳化方式。
嚴格地最佳化查詢效能時,必須要了解所使用的資料庫的功能特性。此外,查詢速度慢不只是因為SQL語句本身,還可能是因為記憶體分配不佳,檔案結構不合理等其他原因。因此這裡介紹的最佳化SQL的方法可能無法解決所有的效能問題,但是確實很多時候的查詢效能不好的原因還是SQL的寫法不合理。
Ø 使用高效率的查詢
在SQL中,很多時候不同程式碼能夠得到相同的結果。從理論上來說,得到相同結果的不同程式碼應該有相同的效能,但遺憾的是,查詢優化器產生的執行計劃很大程度上要受到程式碼外部結構的影響。因此如果想優化查詢效能,必須知道如何寫入程式碼才能讓優化器的執行效率更高。
參數是子查詢時,使用EXISTS代替IN
IN謂詞非常方便,而且程式碼容易理解,所以使用的頻率很高。但方便的同時,IN謂詞卻有成為效能優化的瓶頸的危險。如果程式碼中大量用到IN謂詞,那麼一般只對它們進行最佳化就能大幅提升效能。
如果IN的參數是「1,2,3」這樣的數值列表,一般還不需要特別注意。但是如果參數是子查詢,那就需要注意了。
大多數情況,[NOT]IN和[NOT]EXISTS傳回的結果是相同的。但兩者用於子查詢時,EXISTS的速度會更快一些。
下面來看個例子:
我們試著從Class_A表中查出同時存在於Class_B表中的員工。下面兩個SQL語句傳回的結果是一樣的,但使用EXISTS的SQL語句會更快一些。
#兩個結果都如下所示:
使用EXISTS時更快的原因有以下兩個。
a) 如果連接列(id)上建立了索引,那麼查詢Class_B時不用查詢實際的表,只要查索引就可以了。
b) 如果使用EXISTS,那麼只要查到一行資料滿足條件就會終止查詢,不用像使用IN時一樣掃描全表。在這一點上NOT EXISTS也是一樣。
當IN的參數是子查詢時,資料庫首先會執行子查詢,然後將結果儲存在一個臨時的工作表裡(內聯視圖),然後掃描整個視圖。很多情況下這種做法都非常耗費資源。使用EXISTS的話,資料庫不會產生臨時的工作表。
但從程式碼的可讀性來看,IN要比EXISTS好。使用IN時的程式碼看起來更一目了然,容易理解。因此,如果確信使用IN也能快速取得結果,就沒有必要非要改成EXISTS了。
而且,最近有許多資料庫也嘗試著改善了IN的效能。也許未來的某一天,無論哪個資料庫上,IN都能具體和EXISTS一樣的效能。
參數是子查詢時,使用連接取代IN
要想改善IN的效能,除了使用EXISTS,還可以使用連接。前面的查詢語句就可以像下面這樣「扁平化」。
這種寫法至少能用到一張表的「id」欄位上的索引。而且,因為沒有了子查詢,所以資料庫也不會產生中間表。我們很難說與EXISTS相比哪個更好,但如果沒有索引,那麼與連接相比,可能EXISTS會略勝一籌。而且從許多查詢可以看出,有些情況下使用EXISTS比使用連線更適合。
以上是SQL效能優化提升的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!