- 10.2.1.1 WHERE 子句優化
- 10.2.1.2 範圍優化
- 10.2.1.3 索引合併優化
- 10.2.1.4 雜湊聯結優化
- 10.2.1.5 引擎條件下推優化
- 10.2.1.6 索引條件下推優化
- 10.2.1.7 巢狀迴圈聯結演算法
- 10.2.1.8 巢狀聯結優化
- 10.2.1.9 外部聯結優化
- 10.2.1.10 外部聯結簡化
- 10.2.1.11 多範圍讀取優化
- 10.2.1.12 區塊巢狀迴圈和批次金鑰存取聯結
- 10.2.1.13 條件篩選
- 10.2.1.14 常數摺疊優化
- 10.2.1.15 IS NULL 優化
- 10.2.1.16 ORDER BY 優化
- 10.2.1.17 GROUP BY 優化
- 10.2.1.18 DISTINCT 優化
- 10.2.1.19 LIMIT 查詢優化
- 10.2.1.20 函數呼叫優化
- 10.2.1.21 視窗函數優化
- 10.2.1.22 列建構子運算式優化
- 10.2.1.23 避免完整表格掃描
查詢(以 SELECT
語句的形式)會在資料庫中執行所有查詢作業。調整這些語句是首要任務,無論是要為動態網頁實現次秒回應時間,還是要將產生大量夜間報告的時間縮短數小時。
除了 SELECT
語句之外,查詢的調整技術也適用於諸如 CREATE TABLE...AS SELECT
、INSERT INTO...SELECT
和 DELETE
語句中的 WHERE
子句等結構。這些語句具有額外的效能考量,因為它們將寫入作業與以讀取為導向的查詢作業結合在一起。
NDB Cluster 支援聯結下推優化,其中限定的聯結會完整傳送到 NDB Cluster 資料節點,以便在它們之間進行分散並平行執行。如需此優化的詳細資訊,請參閱 NDB 下推聯結的條件。
優化查詢的主要考量因素是
若要加速緩慢的
SELECT ... WHERE
查詢,首先要檢查的是是否可以新增索引。在WHERE
子句中使用的欄位上設定索引,以加快評估、篩選和最終擷取結果的速度。為了避免浪費磁碟空間,請建構一組小的索引,以加快應用程式中使用的許多相關查詢的速度。對於使用諸如聯結和外部索引鍵等功能來參考不同表格的查詢,索引尤其重要。您可以使用
EXPLAIN
語句來判斷SELECT
使用哪些索引。請參閱第 10.3.1 節,「MySQL 如何使用索引」和第 10.8.1 節,「使用 EXPLAIN 優化查詢」。找出並調整查詢中任何耗時過多的部分,例如函式呼叫。根據查詢的結構,函式可能會針對結果集中的每一列呼叫一次,甚至針對資料表中的每一列呼叫一次,從而大幅放大任何效率低下的情況。
盡量減少查詢中的完整資料表掃描次數,尤其是大型資料表。
定期使用
ANALYZE TABLE
陳述式來保持資料表統計資訊的最新狀態,以便最佳化工具具有建構高效執行計畫所需的信息。學習針對每個資料表的儲存引擎的特定調整技術、索引技術和配置參數。
InnoDB
和MyISAM
都有各自的指導方針,用於在查詢中啟用並維持高效能。有關詳細資訊,請參閱第 10.5.6 節「最佳化 InnoDB 查詢」和第 10.6.1 節「最佳化 MyISAM 查詢」。您可以使用第 10.5.3 節「最佳化 InnoDB 唯讀交易」中的技術,針對
InnoDB
資料表最佳化單一查詢交易。避免以難以理解的方式轉換查詢,尤其是在最佳化工具會自動執行一些相同的轉換時。
如果效能問題無法輕易地透過基本指南解決,請閱讀
EXPLAIN
計畫,並調整您的索引、WHERE
子句、聯結子句等等,來調查特定查詢的內部詳細資訊。(當您達到一定的專業水準時,閱讀EXPLAIN
計畫可能會是您每個查詢的第一步。)調整 MySQL 用於快取的記憶體區域的大小和屬性。藉由有效使用
InnoDB
緩衝池、MyISAM
金鑰快取和 MySQL 查詢快取,重複查詢的執行速度會更快,因為結果會在第二次及後續時間從記憶體中擷取。即使對於使用快取記憶體區域快速執行的查詢,您仍然可以進一步最佳化,使其需要較少的快取記憶體,從而使您的應用程式更具可擴展性。可擴展性表示您的應用程式可以處理更多的同時使用者、更大的請求等等,而不會出現效能大幅下降的情況。
處理鎖定問題,您的查詢速度可能會受到其他同時存取資料表的會話影響。