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值到佔位符。
CUSTOMER_ID | CUSTOMER_NAME |
---|---|
#NO CUSTOMER | |
John Doe | |
Mary Jane | |
Peter Pan | |
#Joe Soap |
SALES_PERSON | |
---|---|
#Newbee Smith | |
Oldie Jones | |
#Another Oldie | |
Greenhorn |

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

InnoDB通過Next-KeyLocking機制有效防止幻讀。 1)Next-KeyLocking結合行鎖和間隙鎖,鎖定記錄及其間隙,防止新記錄插入。 2)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。

MySQL不是一門編程語言,但其查詢語言SQL具備編程語言的特性:1.SQL支持條件判斷、循環和變量操作;2.通過存儲過程、觸發器和函數,用戶可以在數據庫中執行複雜邏輯操作。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用