字體:  

tmp_table_size 和 max_heap_table_size 的設置

ppstream 發表於: 2012-1-27 11:10 來源: ADJ網路控股集團


先說下tmp_table_size吧:
它規定了內部內存臨時表的最大值,每個線程都要分配。(實際起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果內存臨時表超出了限制,MySQL就會自動地把它轉化為基於磁盤的MyISAM表,存儲在指定的tmpdir目錄下~~

優化查詢語句的時候,要避免使用臨時表,如果實在避免不了的話,要保證這些臨時表是存在內存中的。如果需要的話並且你有很多group by語句,並且你有很多內存,增大tmp_table_size(和max_heap_table_size)的值。這個變量不適用與用戶創建的內存表(memory table).

你可以比較內部基於磁盤的臨時表的總數和創建在內存中的臨時表的總數(Created_tmp_disk_tables和Created_tmp_tables),一般的比例關係是:
Created_tmp_disk_tables/Created_tmp_tables<5%

max_heap_table_size
這個變量定義了用戶可以創建的內存表(memory table)的大小.這個值用來計算內存表的最大行數值。這個變量支持動態改變,即set @max_heap_table_size=#
,但是對於已經存在的內存表就沒有什麼用了,除非這個表被重新創建(create table)或者修改(alter table)或者truncate table。服務重啟也會設置已經存在的內存表為全局max_heap_table_size的值。

這個變量和tmp_table_size一起限制了內部內存表的大小。

設定參考值...依自己實際狀況再調整:
tmp_table_size = 64M
max_tmp_tables = 32
max_heap_table_size = 64M