用於 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_size
、read_buffer_size
)除了全域值之外,還有一個工作階段值。設定工作階段值會將變更的效果限制在您目前的工作階段,並且不會影響其他使用者。變更僅限全域的變數(key_buffer_size
、myisam_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
全域設定為較大的值會對所有工作階段執行此操作,並且由於具有許多同時工作階段的伺服器記憶體分配過多,可能會導致效能下降。