- 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 查詢快取,重複查詢執行速度會更快,因為第二次及後續執行時會從記憶體檢索結果。即使對於使用快取記憶體區域快速執行的查詢,您仍然可以進一步優化,使其需要較少的快取記憶體,從而使您的應用程式更具可擴展性。可擴展性表示您的應用程式可以處理更多同時使用者、更大的請求等等,而不會發生大幅效能下降。
處理鎖定問題,其中查詢的速度可能會受到其他同時存取表格的工作階段影響。