首頁 > 資料庫 > mysql教程 > 優化 SQL SELECT 語句效能的 6 個簡單技巧

優化 SQL SELECT 語句效能的 6 個簡單技巧

黄舟
發布: 2017-02-22 11:12:11
原創
1087 人瀏覽過

SELECT語句的效能調優有時是一個非常耗時的任務,在我看來它遵循帕累托原則。 20%的努力很可能會為你帶來80%的效能提升,而為了獲得另外20%的效能提升你可能需要花費80%的時間。除非你在金星工作,那裡的每一天都等於地球上的243天,否則交付期限很有可能會讓你沒有足夠的時間來調優SQL查詢。

根據我多年編寫和運行SQL語句的經驗,我開始開發一個檢查列表,當我試圖提高查詢效能時供我參考。在進行查詢計劃和閱讀我使用的資料庫文件之前,我會參考其中的內容,資料庫文件有時會很複雜。我的檢查清單絕對說不上全面或科學,它更像是一個保守計算,但我可以說,遵循這些簡單的步驟大部分時間我確實能得到性能提升。檢查列表如下。

檢查索引

在SQL語句的WHERE和JOIN部分中所用到的所有欄位上,都應該加上索引。進行這個3分鐘SQL效能測試。不管你的成績如何,一定要閱讀那些帶有訊息的結果。

限制工作資料集的大小

檢查那些SELECT語句中使用的表,看看你是否可以套用WHERE子句來篩選。一個典型的例子是,當表中只有幾千行記錄時,一個查詢能夠很好地執行。但隨著應用程式的成長,查詢慢了下來。解決方案或許非常簡單,限制查詢來查看當前月的資料即可。

當你的查詢語句有子查詢時,注意在子查詢的內部語句上使用過濾,而不是在外部語句上。

只選擇你需要的欄位

額外的欄位通常會增加傳回資料的紋理,導致更多的資料回到SQL客戶端。另外:

•使用具有報告和分析功能的應用程式時,有時報告效能低是因為報告工具必須對收到的、帶有詳細形式的資料做聚合操作。

•偶爾查詢也可能運行地足夠快,但你的問題可能是一個與網絡相關的問題,因為大量的詳細數據通過網絡發送到報告伺服器。

•當使用一個以列導向的DBMS時,只有你選擇的欄位會從磁碟讀取。在你的查詢中包含的列越少,IO開銷就越小。

移除不必要的表格

移除不必要的表的原因,和移除查詢語句中不需要的欄位的原因一致。

寫SQL語句是一個過程,通常需要大量編寫和測試SQL語句的迭代過程。在開發過程中,你可能會將表格加入查詢中,而這對於SQL程式碼傳回的資料可能不會有任何影響。一旦SQL運行正確,我發現許多人不會回顧他們的腳本,不會刪除那些對最終的回傳資料沒有任何影響和作用的表。透過移除與那些不必要表的JOINS操作,你減少了大量資料庫必須執行的流程。有時,就像移除列一樣,你會發現你減少的資料又透過資料庫回傳來了。

移除外部連線查詢

這說起來容易做起來難,它取決於改變表的內容有多大的影響。一個解決辦法是透過在兩個表的行中放置佔位符來刪除OUTER JOINS運算。假設你有以下的表,它們透過定義OUTER JOINS來確保傳回所有的資料:

CUSTOMER_ID CUSTOMER_NAME
1 John Doe
#2 Mary Jane
3 Peter Pan
4 #Joe Soap
CUSTOMER_ID SALES_PERSON
NULL Newbee Smith
2 Oldie Jones
#1 Another Oldie
NULL Greenhorn

解決方法是在customer表的行中增加一個佔位符,並更新sales表中的所有NULL值到佔位符。

##0#NO CUSTOMER 1John Doe#2Mary Jane#3Peter Pan4#Joe Soap
CUSTOMER_ID CUSTOMER_NAME
CUSTOMER_IDSALES_PERSON#Newbee Smith#2Oldie Jones1#Another Oldie##0

你不只是刪除了對OUTER JOIN操作的依賴,同時標準化了沒有客戶的銷售人員如何表示。其他開發者不必寫額外語句,例如ISNULL(customer_id, “No customer yet”)。

刪除JOIN和WHERE子句中的計算欄位

這是另一個有時可能說起來容易做起來難的技巧,它取決於你更改表格模式的權限大小。可以將連接語句中用到的計算欄位作為一個新欄位在表中建立。給出以下SQL語句:

FROM sales a 
JOIN budget b ON    ((YEAR(a.sale_date)* 100) + MONTH(a.sale_date)) = b.budget_year_month
登入後複製

在sales表中利用年和月增加一列,可以提高效能。更新後的SQL語句將如下:

SELECT * FROM PRODUCTSFROM sales a 
JOIN budget b ON    a.sale_year_month = b.budget_year_month
登入後複製

總結

上邊的建議可以歸結為以下幾點:

•檢查索引

•在所需要的最小資料集上操作

•移除不必要的欄位和表格

#•移除你JOIN和WHERE子句中的計算操作

#如果所有的這些建議都沒能提升你的SQL查詢效能,最後一個建議是搬去金星吧。你需要的就是一天能調優你的SQL語句。

以上就是優化 SQL SELECT 語句效能的 6 個簡單技巧的內容,更多相關內容請關注PHP中文網(www.php.cn)!


Greenhorn
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板