文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  優化 REPAIR TABLE 語句

10.6.3 優化 REPAIR TABLE 語句

用於 MyISAM 資料表的 REPAIR TABLE 類似於使用 myisamchk 進行修復作業,並且適用一些相同的效能最佳化

  • myisamchk 具有控制記憶體配置的變數。您可以透過設定這些變數來改善其效能,如第 6.6.4.6 節「myisamchk 記憶體使用」中所述。

  • 對於 REPAIR TABLE,相同的原則適用,但由於修復是由伺服器完成,因此您設定的是伺服器系統變數,而不是 myisamchk 變數。此外,除了設定記憶體配置變數外,增加 myisam_max_sort_file_size 系統變數會增加修復使用較快的 filesort 方法並避免使用較慢的鍵快取方法修復的可能性。在檢查以確保有足夠的可用空間來存放資料表檔案的副本後,將變數設定為您系統的最大檔案大小。可用空間必須位於包含原始資料表檔案的檔案系統中。

假設 myisamchk 資料表修復作業是使用以下選項來設定其記憶體配置變數

--key_buffer_size=128M --myisam_sort_buffer_size=256M
--read_buffer_size=64M --write_buffer_size=64M

其中一些 myisamchk 變數對應於伺服器系統變數

myisamchk 變數 系統變數
key_buffer_size key_buffer_size
myisam_sort_buffer_size myisam_sort_buffer_size
read_buffer_size read_buffer_size
write_buffer_size none

每個伺服器系統變數都可以在執行時設定,其中一些變數(myisam_sort_buffer_sizeread_buffer_size)除了全域值之外,還有一個工作階段值。設定工作階段值會將變更的效果限制在您目前的工作階段,並且不會影響其他使用者。變更僅限全域的變數(key_buffer_sizemyisam_max_sort_file_size)也會影響其他使用者。對於 key_buffer_size,您必須考慮到緩衝區是與那些使用者共用的。例如,如果您將 myisamchk key_buffer_size 變數設定為 128MB,您可以將對應的 key_buffer_size 系統變數設定得更大(如果它尚未設定得更大),以允許其他工作階段中的活動使用索引鍵緩衝區。然而,變更全域索引鍵緩衝區大小會使緩衝區失效,導致其他工作階段的磁碟 I/O 增加和速度減慢。避免這個問題的替代方法是使用單獨的索引鍵快取,將要修復的表格中的索引指派給它,並在修復完成時解除分配它。請參閱第 10.10.2.2 節,「多重索引鍵快取」

根據前面的說明,可以按如下方式執行 REPAIR TABLE 操作,以使用類似於 myisamchk 命令的設定。這裡分配了一個單獨的 128MB 索引鍵緩衝區,並且假設檔案系統允許至少 100GB 的檔案大小。

SET SESSION myisam_sort_buffer_size = 256*1024*1024;
SET SESSION read_buffer_size = 64*1024*1024;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
SET GLOBAL repair_cache.key_buffer_size = 128*1024*1024;
CACHE INDEX tbl_name IN repair_cache;
LOAD INDEX INTO CACHE tbl_name;
REPAIR TABLE tbl_name ;
SET GLOBAL repair_cache.key_buffer_size = 0;

如果您打算變更全域變數,但只想在 REPAIR TABLE 操作期間進行變更,以盡量減少對其他使用者的影響,請將其值儲存在使用者變數中,然後再還原它。例如

SET @old_myisam_sort_buffer_size = @@GLOBAL.myisam_max_sort_file_size;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
REPAIR TABLE tbl_name ;
SET GLOBAL myisam_max_sort_file_size = @old_myisam_max_sort_file_size;

如果您希望這些值預設生效,可以在伺服器啟動時全域設定影響 REPAIR TABLE 的系統變數。例如,將這些行新增至伺服器 my.cnf 檔案

[mysqld]
myisam_sort_buffer_size=256M
key_buffer_size=1G
myisam_max_sort_file_size=100G

這些設定不包含 read_buffer_size。將 read_buffer_size 全域設定為較大的值會對所有工作階段執行此操作,並且由於具有許多同時工作階段的伺服器記憶體分配過多,可能會導致效能下降。