REPAIR TABLE
對於 MyISAM
資料表,類似於使用 myisamchk 進行修復作業,且適用於相同的效能最佳化
myisamchk 具有控制記憶體配置的變數。您可以透過設定這些變數來改善其效能,如第 6.6.4.6 節「myisamchk 記憶體使用」所述。
對於
REPAIR TABLE
,相同的原則適用,但因為修復是由伺服器完成的,所以您設定的是伺服器系統變數,而非 myisamchk 變數。此外,除了設定記憶體配置變數外,增加myisam_max_sort_file_size
系統變數會增加修復使用較快檔案排序方法,並避免較慢的依金鑰快取修復方法的可能性。在檢查確定有足夠的可用空間來容納資料表檔案複本後,將該變數設定為您系統的最大檔案大小。可用空間必須在包含原始資料表檔案的檔案系統中。
假設使用下列選項設定其記憶體配置變數來完成 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 |
無 |
每個伺服器系統變數都可以在執行階段設定,其中一些變數(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
全域設定為較大的值會對所有工作階段都產生影響,並可能由於具有多個同時工作階段的伺服器記憶體配置過多而導致效能下降。