* Join操作使用內存(join_buffer_size): 應用程序經常會出現一些兩表(或多表)Join的操作需求,MySQL在完成某些Join需求的時候(all/index join),為了減少參與Join的“被驅動表”的讀取次數以提高性能,需要使用到Join Buffer來協助完成Join操作 (具體Join實現算法請參考:MySQL中的 Join 基本實現原理)。當Join Buffer太小,MySQL 不會將該Buffer存入磁盤文件,而是先將Join Buffer中的結果集與需要Join的表進行Join操作,然后清空Join Buffer中的數據, 繼續將剩余的結果集寫入此Buffer中,如此往復。這勢必會造成被驅動表需要被多次讀取,成倍增加IO訪問,降低效率。 什么時候會用到? 當查詢必須連接兩個表(或多個)的數據集并且不能使用索引時,這個緩沖區會被用到。這個緩沖區專門為每個線程的無索引鏈接操作準備的。 使用確認: 可以通過查詢計劃中的Extra列的值為Using join bufer來證實使用了和這個緩沖區。 >explain select * from user1; +------+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | user1 | index | NULL | name | 78 | NULL | 3 | Using index | +------+-------------+-------+-------+---------------+------+---------+------+------+-------------+ Global Session,Dynamic,Default 128K 各版本平臺最大值不一樣 推薦配置:8M(內存足夠的情況下),默認(內存緊張的情況) 優化建議:有一種說法是增加這個緩沖區的大小不會加快全連接操作的速度。目前我沒有實驗證實。
* 批量插入暫存使用內存(bulk_insert_buffer_size): 當我們使用如 insert … values(…),(…),(…)… 的方式進行批量插入的時候,MySQL會先將提交的數據放如一個緩存空間中,當該緩存空間被寫滿或者提交完所有數據之后,MySQL才會一次性將該緩存空間中的數據寫入數據庫并清空緩存。 此外,當我們進行 LOAD DATA INFILE操作來將文本文件中的數據Load進數據庫的時候,同樣會使用到此緩沖區。 Global Session,Dynamic,Default 8M 推薦配置:默認 8M * 臨時表使用內存(tmp_table_size): 當我們進行一些特殊操作如需要使用臨時表才能完成的Order By,Group By 等等,MySQL可能需要使用到臨時表。當我們的臨時表較小(小于tmp_table_size 參數所設置的大小)的時候,MySQL會將臨時表創建成內存臨時表, 只有當tmp_table_size所設置的大小無法裝下整個臨時表的時候,MySQL才會將該表創建成MyISAM存儲引擎的表存放在磁盤上。不過,當另一個系統參數 max_heap_table_size 的大小還小于 tmp_table_size 的時候, MySQL將使用 max_heap_table_size 參數所設置大小作為最大的內存臨時表大小,而忽略tmp_table_size 所設置的值。而且 tmp_table_size 參數從 MySQL 5.1.2 才開始有,之前一直使用 max_heap_table_size。 誰小誰生效.另外還有一個參數max_tmp_tables,沒有使用 tmp_table_size Global Session,Dynamic,Default 16M 推薦配置:64M max_heap_table_size Global Session,Dynamic,Default 8M This variable sets the maximum size to which user-created MEMORY tables are permitted to grow 這個變量定義了MEMORY存儲引擎表的最大容量。