1. 程式人生 > >3.MySQL優化Optimizing REPAIR TABLE Statements

3.MySQL優化Optimizing REPAIR TABLE Statements

介紹

REPAIR TABLE對於 MyISAM表類似於使用 myisamchk進行修復操作,並且一些相同的效能優化適用:

  • myisamchk具有控制記憶體分配的變數。您可以通過設定這些變數來提高效能。
  • 對於REPAIR TABLE,他與myisamchk的原理相同,但是因為修復是由伺服器完成的,所以設定伺服器系統變數而不是myisamchk變數。
  • 此外,除了設定記憶體相關引數之外,還可以增加 myisam_max_sort_file_size 引數的值,還可能增加使用快速的filesort修復方式替代較慢的 key cache方式的修復方式。這個變數的最大值,是你能保證硬碟有足夠的空間儲存資料的副本,將變數設定為系統的最大檔案大小。必須在包含原始表文件的檔案系統中提供可用空間。

假設使用以下選項完成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為128M,您可以將相應的key_buffer_size系統變數設定為大於該值,允許其他活動中的會話使用key buffer。但是更改 global key buffer size會使buffer失效,使磁碟I/O增長,並影響其他session執行效率。避免此問題的方法是使用單獨的key cache,併為表修復分配索引,使用完之後釋放。

如前所述,REPAIR TABLE 指令與myisamchk使用方式相似,下面分配了128M的key buffer,並且檔案系統有大於100G磁碟空間:

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全域性設定為較大的值會對所有會話執行此操作,並且可能會因為具有多個同時會話的伺服器的過多記憶體分配而導致效能受損。