如果您遵循資料庫設計的最佳實務和 SQL 操作的調整技術,但您的資料庫由於大量的磁碟 I/O 活動仍然很慢,請考慮這些磁碟 I/O 優化。如果 Unix top
工具或 Windows 工作管理員顯示您的工作負載的 CPU 使用率百分比低於 70%,則您的工作負載可能受限於磁碟。
增加緩衝池大小
當資料表資料快取在
InnoDB
緩衝池中時,查詢可以重複存取,而無需任何磁碟 I/O。使用innodb_buffer_pool_size
選項指定緩衝池的大小。此記憶體區域非常重要,通常建議將innodb_buffer_pool_size
設定為系統記憶體的 50% 到 75%。如需更多資訊,請參閱第 10.12.3.1 節,「MySQL 如何使用記憶體」。調整刷新方法
在某些版本的 GNU/Linux 和 Unix 中,使用 Unix
fsync()
呼叫和類似方法將檔案刷新到磁碟的速度非常慢。如果資料庫寫入效能是個問題,請使用設定為O_DSYNC
的innodb_flush_method
參數進行基準測試。設定作業系統刷新的臨界值
預設情況下,當
InnoDB
建立新的資料檔案時,例如新的記錄檔或資料表空間檔案,該檔案會先完整寫入作業系統快取,然後再刷新到磁碟,這可能會導致一次發生大量的磁碟寫入活動。為了強制較小、週期性地從作業系統快取刷新資料,您可以使用innodb_fsync_threshold
變數來定義以位元組為單位的臨界值。當達到位元組臨界值時,作業系統快取的內容將刷新到磁碟。預設值為 0 會強制預設行為,即僅在將檔案完整寫入快取後才將資料刷新到磁碟。在多個 MySQL 執行個體使用相同儲存裝置的情況下,指定臨界值以強制較小、週期性地刷新可能會有好處。例如,建立新的 MySQL 執行個體及其相關的資料檔案可能會導致大量的磁碟寫入活動激增,從而妨礙使用相同儲存裝置的其他 MySQL 執行個體的效能。設定臨界值有助於避免寫入活動的此類激增。
使用 fdatasync() 而不是 fsync()
在支援
fdatasync()
系統呼叫的平台上,innodb_use_fdatasync
變數允許使用fdatasync()
而不是fsync()
進行作業系統刷新。fdatasync()
系統呼叫不會刷新對檔案中繼資料的變更,除非後續資料擷取需要,這提供潛在的效能優勢。innodb_flush_method
設定的子集(例如fsync
、O_DSYNC
和O_DIRECT
)使用fsync()
系統呼叫。當使用這些設定時,innodb_use_fdatasync
變數適用。在 Linux 上使用原生 AIO 時使用 noop 或 deadline I/O 排程器
在 Linux 上,
InnoDB
使用非同步 I/O 子系統(原生 AIO)來執行資料檔案頁面的預讀和寫入請求。此行為由innodb_use_native_aio
配置選項控制,預設為啟用。使用原生 AIO 時,I/O 排程器的類型對 I/O 效能有較大的影響。一般來說,建議使用 noop 和 deadline I/O 排程器。請進行基準測試以確定哪個 I/O 排程器為您的工作負載和環境提供最佳結果。如需更多資訊,請參閱第 17.8.6 節「在 Linux 上使用非同步 I/O」。在 Solaris 10 的 x86_64 架構上使用直接 I/O
當在 Solaris 10 的 x86_64 架構 (AMD Opteron) 上使用
InnoDB
儲存引擎時,請對InnoDB
相關檔案使用直接 I/O,以避免InnoDB
效能下降。若要對用於儲存InnoDB
相關檔案的整個 UFS 檔案系統使用直接 I/O,請使用forcedirectio
選項掛載它;請參閱mount_ufs(1M)
。(Solaris 10/x86_64 上的預設值不是使用此選項。)若要僅對InnoDB
檔案操作而非整個檔案系統套用直接 I/O,請設定innodb_flush_method = O_DIRECT
。使用此設定時,InnoDB
會為資料檔案的 I/O 呼叫directio()
而非fcntl()
(不適用於記錄檔的 I/O)。對 Solaris 2.6 或更新版本使用原始儲存空間來儲存資料和記錄檔
當在任何 Solaris 2.6 及更新版本和任何平台 (sparc/x86/x64/amd64) 上使用
InnoDB
儲存引擎,並且具有較大的innodb_buffer_pool_size
值時,請使用原始裝置上的InnoDB
資料檔案和記錄檔或單獨的直接 I/O UFS 檔案系統進行基準測試,並如先前所述使用forcedirectio
掛載選項。(如果您希望記錄檔使用直接 I/O,則必須使用掛載選項,而不是設定innodb_flush_method
。)Veritas 檔案系統 VxFS 的使用者應使用convosync=direct
掛載選項。請勿將其他 MySQL 資料檔案(例如
MyISAM
資料表的資料檔案)放置在直接 I/O 檔案系統上。可執行檔或程式庫絕對不可放置在直接 I/O 檔案系統上。使用額外的儲存裝置
額外的儲存裝置可用於設定 RAID 配置。如需相關資訊,請參閱第 10.12.1 節「最佳化磁碟 I/O」。
或者,
InnoDB
表空間資料檔案和記錄檔可以放置在不同的實體磁碟上。如需更多資訊,請參閱下列章節:考慮使用非旋轉式儲存裝置
一般來說,非旋轉式儲存裝置對隨機 I/O 操作提供更好的效能;而旋轉式儲存裝置則對循序 I/O 操作提供更好的效能。當在旋轉式和非旋轉式儲存裝置之間分配資料和記錄檔時,請考慮主要在每個檔案上執行的 I/O 操作類型。
以隨機 I/O 為導向的檔案通常包含每個資料表的檔案和一般表空間資料檔案、復原表空間檔案和暫時表空間檔案。以循序 I/O 為導向的檔案包含
InnoDB
系統表空間檔案、雙寫入檔案和記錄檔,例如二進位記錄檔和重做記錄檔。使用非旋轉式儲存裝置時,請檢閱下列配置選項的設定:
crc32
選項使用更快的檢查總和演算法,建議用於快速儲存系統。最佳化旋轉式儲存裝置的 I/O。針對非旋轉式儲存裝置或旋轉式和非旋轉式儲存裝置的組合停用它。預設為停用。
允許在閒置期間限制頁面清除,這有助於延長非旋轉式儲存裝置的壽命。
預設設定 10000 通常就足夠了。
預設值(2 *
innodb_io_capacity
)適用於大多數工作負載。如果重做記錄位於非旋轉式儲存裝置上,請考慮停用此選項以減少記錄。請參閱停用壓縮頁面的記錄。
innodb_log_file_size
(已淘汰)如果重做記錄位於非旋轉式儲存裝置上,請配置此選項以最大化快取和寫入組合。
如果重做記錄位於非旋轉式儲存裝置上,請配置此選項以最大化快取和寫入組合。
請考慮使用符合磁碟內部磁區大小的頁面大小。早期世代的 SSD 裝置通常具有 4KB 的磁區大小。某些較新的裝置具有 16KB 的磁區大小。預設的
InnoDB
頁面大小為 16KB。讓頁面大小接近儲存裝置的區塊大小,可將重寫到磁碟的未變更資料量降到最低。如果二進位記錄位於非旋轉式儲存裝置上,且所有資料表都有主鍵,請考慮將此選項設定為
minimal
以減少記錄。
確保您的作業系統已啟用 TRIM 支援。通常預設為啟用。
提高 I/O 容量以避免積壓
如果因為
InnoDB
檢查點操作而導致輸送量週期性下降,請考慮增加innodb_io_capacity
配置選項的值。較高的值會導致更頻繁的清除,避免可能導致輸送量下降的工作積壓。如果清除沒有落後,則降低 I/O 容量
如果系統的
InnoDB
清除操作沒有落後,請考慮降低innodb_io_capacity
配置選項的值。通常,您會盡可能將此選項值保持在實用的低位,但不能太低,以免如前述項目所述,導致輸送量週期性下降。在您可以降低選項值的典型情況下,您可能會在SHOW ENGINE INNODB STATUS
的輸出中看到如下的組合:歷程記錄清單長度很短,低於數千個。
插入緩衝區合併接近插入的列數。
緩衝池中已修改的頁面始終遠低於緩衝池的
innodb_max_dirty_pages_pct
。(在伺服器未執行大量插入時測量;在大量插入期間,修改過的頁面百分比顯著上升是正常的。)記錄序號 - 上次檢查點
小於InnoDB
記錄檔總大小的 7/8,理想情況下小於 6/8。
將系統表空間檔案儲存在 Fusion-io 裝置上
您可以透過將包含雙寫入儲存區域的檔案儲存在支援原子寫入的 Fusion-io 裝置上,來利用雙寫入緩衝區相關的 I/O 最佳化。(雙寫入緩衝區儲存區域位於雙寫入檔案中。請參閱第 17.6.4 節「雙寫入緩衝區」。)當雙寫入儲存區域檔案放置在支援原子寫入的 Fusion-io 裝置上時,雙寫入緩衝區會自動停用,且 Fusion-io 原子寫入會用於所有資料檔案。此功能僅在 Fusion-io 硬體上支援,且僅在 Linux 上的 Fusion-io NVMFS 上啟用。若要充分利用此功能,建議將
innodb_flush_method
設定為O_DIRECT
。注意因為雙寫入緩衝區設定是全域的,因此雙寫入緩衝區也會針對未駐留在 Fusion-io 硬體上的資料檔案停用。
當使用
InnoDB
資料表壓縮功能時,當壓縮資料發生變更時,重新壓縮頁面的映像會寫入重做記錄。此行為由innodb_log_compressed_pages
控制,預設為啟用,以防止復原期間使用不同版本的zlib
壓縮演算法時可能發生的損毀。如果您確定zlib
版本不會變更,請停用innodb_log_compressed_pages
以減少修改壓縮資料之工作負載的重做記錄產生。