資料庫效能取決於資料庫層級的幾個因素,例如資料表、查詢和組態設定。這些軟體結構會在硬體層級產生 CPU 和 I/O 操作,您必須將其最小化並使其盡可能有效率。在處理資料庫效能時,您首先要學習軟體方面的高階規則和指南,並使用實際時間來測量效能。當您成為專家時,您會更深入瞭解內部發生的情況,並開始測量 CPU 週期和 I/O 操作等項目。
一般使用者旨在從其現有的軟體和硬體組態中獲得最佳的資料庫效能。進階使用者會尋找機會來改進 MySQL 軟體本身,或開發自己的儲存引擎和硬體設備,以擴展 MySQL 生態系統。
使資料庫應用程式快速的最重要因素是其基本設計
資料表的結構是否正確?特別是,欄位是否具有正確的資料類型,並且每個資料表是否具有適合工作類型的適當欄位?例如,執行頻繁更新的應用程式通常會有許多欄位較少的資料表,而分析大量資料的應用程式通常會有少量欄位較多的資料表。
是否已設置正確的索引以提高查詢效率?
您是否為每個資料表使用適當的儲存引擎,並利用您使用的每個儲存引擎的優勢和功能?特別是,選擇交易式儲存引擎(例如
InnoDB
)或非交易式儲存引擎(例如MyISAM
)對於效能和可擴展性可能非常重要。注意InnoDB
是新資料表的預設儲存引擎。在實務上,先進的InnoDB
效能功能表示InnoDB
資料表通常會優於較簡單的MyISAM
資料表,尤其是在忙碌的資料庫中。每個資料表都使用適當的資料列格式嗎?這個選擇也取決於資料表所使用的儲存引擎。特別是,壓縮的資料表會使用較少的磁碟空間,因此讀寫資料時需要的磁碟 I/O 也較少。壓縮功能適用於所有種類的工作負載,使用
InnoDB
資料表,以及唯讀的MyISAM
資料表。應用程式是否使用了適當的鎖定策略?例如,在可能的情況下允許共享存取,以便資料庫操作可以同時執行,並在適當的時候請求獨佔存取,以便關鍵操作獲得最高優先權。同樣地,儲存引擎的選擇非常重要。
InnoDB
儲存引擎可以處理大多數鎖定問題,而無需您介入,從而提高資料庫的並行性,並減少程式碼的實驗和調整次數。所有用於快取的記憶體區域是否都已正確調整大小?也就是說,大小足以容納經常存取的資料,但又不會太大而導致實體記憶體過載並造成分頁。主要需要設定的記憶體區域是
InnoDB
緩衝池和MyISAM
金鑰快取。
隨著資料庫變得越來越繁忙,任何資料庫應用程式最終都會達到硬體限制。DBA 必須評估是否可以調整應用程式或重新配置伺服器以避免這些瓶頸,或者是否需要更多硬體資源。系統瓶頸通常來自以下這些來源:
磁碟尋找。磁碟需要時間來找到一段資料。對於現代磁碟而言,此平均時間通常低於 10 毫秒,因此理論上我們每秒可以執行約 100 次尋找。此時間隨著新磁碟而緩慢改進,並且很難針對單個資料表進行最佳化。最佳化尋找時間的方法是將資料分散到多個磁碟上。
磁碟讀寫。當磁碟處於正確位置時,我們需要讀取或寫入資料。對於現代磁碟而言,一個磁碟至少可以提供 10–20MB/s 的輸送量。這比尋找更容易最佳化,因為您可以從多個磁碟並行讀取。
CPU 週期。當資料在主記憶體中時,我們必須處理它以獲得結果。相較於記憶體大小,擁有大型資料表是最常見的限制因素。但是,對於小型資料表,速度通常不是問題。
記憶體頻寬。當 CPU 需要比 CPU 快取中可以容納的更多資料時,主記憶體頻寬就會成為瓶頸。對於大多數系統而言,這是一個不常見的瓶頸,但需要注意。
要在可移植的 MySQL 程式中使用以效能為導向的 SQL 擴充功能,您可以將 MySQL 特有的關鍵字包裝在 /*! */
註解分隔符號內的陳述式中。其他 SQL 伺服器會忽略註解的關鍵字。有關撰寫註解的資訊,請參閱第 11.7 節,「註解」。