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

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

Feb 22, 2017 am 11:12 AM

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
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Hibernate 框架中 HQL 和 SQL 的差異是什麼? Hibernate 框架中 HQL 和 SQL 的差異是什麼? Apr 17, 2024 pm 02:57 PM

Hibernate 框架中 HQL 和 SQL 的差異是什麼?

Oracle SQL中除法運算的用法 Oracle SQL中除法運算的用法 Mar 10, 2024 pm 03:06 PM

Oracle SQL中除法運算的用法

SQL中的identity屬性是什麼意思? SQL中的identity屬性是什麼意思? Feb 19, 2024 am 11:24 AM

SQL中的identity屬性是什麼意思?

Oracle與DB2的SQL語法比較與區別 Oracle與DB2的SQL語法比較與區別 Mar 11, 2024 pm 12:09 PM

Oracle與DB2的SQL語法比較與區別

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

詳解MyBatis動態SQL標籤中的Set標籤功能

SQL出現5120錯誤怎麼解決 SQL出現5120錯誤怎麼解決 Mar 06, 2024 pm 04:33 PM

SQL出現5120錯誤怎麼解決

如何使用SQL語句在MySQL中進行資料聚合和統計? 如何使用SQL語句在MySQL中進行資料聚合和統計? Dec 17, 2023 am 08:41 AM

如何使用SQL語句在MySQL中進行資料聚合和統計?

資料庫技術大比拼:Oracle和SQL的差別有哪些? 資料庫技術大比拼:Oracle和SQL的差別有哪些? Mar 09, 2024 am 08:30 AM

資料庫技術大比拼:Oracle和SQL的差別有哪些?

See all articles