文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  優化 InnoDB 磁碟 I/O

10.5.8 優化 InnoDB 磁碟 I/O

如果您遵循資料庫設計的最佳實務和 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_DSYNCinnodb_flush_method 參數進行基準測試。

  • 設定作業系統刷新的臨界值

    預設情況下,當 InnoDB 建立新的資料檔案時,例如新的記錄檔或資料表空間檔案,該檔案會先完整寫入作業系統快取,然後再刷新到磁碟,這可能會導致一次發生大量的磁碟寫入活動。為了強制較小、週期性地從作業系統快取刷新資料,您可以使用 innodb_fsync_threshold 變數來定義以位元組為單位的臨界值。當達到位元組臨界值時,作業系統快取的內容將刷新到磁碟。預設值為 0 會強制預設行為,即僅在將檔案完整寫入快取後才將資料刷新到磁碟。

    在多個 MySQL 執行個體使用相同儲存裝置的情況下,指定臨界值以強制較小、週期性地刷新可能會有好處。例如,建立新的 MySQL 執行個體及其相關的資料檔案可能會導致大量的磁碟寫入活動激增,從而妨礙使用相同儲存裝置的其他 MySQL 執行個體的效能。設定臨界值有助於避免寫入活動的此類激增。

  • 使用 fdatasync() 而不是 fsync()

    在支援 fdatasync() 系統呼叫的平台上,innodb_use_fdatasync 變數允許使用 fdatasync() 而不是 fsync() 進行作業系統刷新。fdatasync() 系統呼叫不會刷新對檔案中繼資料的變更,除非後續資料擷取需要,這提供潛在的效能優勢。

    innodb_flush_method 設定的子集(例如 fsyncO_DSYNCO_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 系統表空間檔案、雙寫入檔案和記錄檔,例如二進位記錄檔和重做記錄檔。

    使用非旋轉式儲存裝置時,請檢閱下列配置選項的設定:

    • innodb_checksum_algorithm

      crc32 選項使用更快的檢查總和演算法,建議用於快速儲存系統。

    • innodb_flush_neighbors

      最佳化旋轉式儲存裝置的 I/O。針對非旋轉式儲存裝置或旋轉式和非旋轉式儲存裝置的組合停用它。預設為停用。

    • innodb_idle_flush_pct

      允許在閒置期間限制頁面清除,這有助於延長非旋轉式儲存裝置的壽命。

    • innodb_io_capacity

      預設設定 10000 通常就足夠了。

    • innodb_io_capacity_max

      預設值(2 * innodb_io_capacity)適用於大多數工作負載。

    • innodb_log_compressed_pages

      如果重做記錄位於非旋轉式儲存裝置上,請考慮停用此選項以減少記錄。請參閱停用壓縮頁面的記錄

    • innodb_log_file_size(已淘汰)

      如果重做記錄位於非旋轉式儲存裝置上,請配置此選項以最大化快取和寫入組合。

    • innodb_redo_log_capacity

      如果重做記錄位於非旋轉式儲存裝置上,請配置此選項以最大化快取和寫入組合。

    • innodb_page_size

      請考慮使用符合磁碟內部磁區大小的頁面大小。早期世代的 SSD 裝置通常具有 4KB 的磁區大小。某些較新的裝置具有 16KB 的磁區大小。預設的 InnoDB 頁面大小為 16KB。讓頁面大小接近儲存裝置的區塊大小,可將重寫到磁碟的未變更資料量降到最低。

    • binlog_row_image

      如果二進位記錄位於非旋轉式儲存裝置上,且所有資料表都有主鍵,請考慮將此選項設定為 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 以減少修改壓縮資料之工作負載的重做記錄產生。