mysql執行緒獨佔記憶體引數

markzy5201190發表於2013-06-28

thread_stack 執行緒棧資訊使用記憶體
default:192KB,用來存放每一個執行緒自身的標識資訊及執行緒棧分配多大的記憶體,如thread_id,執行緒執行時基本資訊


mysql排序演算法:
第一種,mysql4.1之前演算法,實現方式是先將需要排序的欄位columns和可以直接定位到相關行row資料的指標資訊取出,
然後在設定的排序區(sort_buffer_size)中排序,完成排序之後再次通過行指標資訊取出所需的columns,也就是需
要訪問2次資料;
第二種,自mysql4.1開始使用改進的演算法,一次性將所需的columns全部取出,在排序區排序後直接將資料返回給請求客戶端。
注意點:改進後的演算法只需要訪問一次資料,減少了大量的隨機IO,極大提高排序query語句效率,但,改進後演算法一次性取
出資料比第一種演算法要很多。故給出引數:max_length_for_sort_data
sort_buffer_size 排序使用記憶體 每個需要進行排序的執行緒分配該大小的一個快取區 
default:2M,用此記憶體區域進行排序操作(filesort),完成客戶端排序請求。若我們設定的排序區快取大小無法滿足
排序實際所需記憶體,會將資料寫入磁碟檔案來完成排序。
使用這個引數時,引入引數max_length_for_sort_data 用於控制排序時選擇第一種演算法還是第二種,當取出所有大欄位總大小
大於此引數,選擇第一種排序演算法,否則第2種演算法

join_buffer_size 連線操作使用記憶體
default:8M,join基本實現原理:Nested Loop Join,通過驅動表的結果集作為迴圈基礎資料,然後一條
一條的通過該結果集中的資料作為過濾條件到下一個表中查詢資料,然後合併結果。如果還有第三個參
與Join,則再通過前2個表的Join結果集作為迴圈基礎資料,再一次通過迴圈查詢條件到第三個表中查詢
資料,如此往復。
在Join型別是ALL,index,rang 或 index_merge時觸發使用Join buffer

read_buffer_size 順序讀取資料緩衝區使用記憶體
用於當需要順序讀取資料的時候,如無法用索引情況下全表掃描,全索引掃描等,在此情況,mysql按照數
據的儲存順序依次讀取資料塊,每次讀取資料塊首先暫存在read_buffer_size中,當buffer空間被寫滿或
全部資料讀取結束後,再將buffer中的資料返回給上層呼叫者,以提高效率。

read_rnd_buffer_size 隨機讀取資料緩衝區使用記憶體
default:8M 當Mysql進行非順序讀取(隨機讀取)資料塊時,會利用這個緩衝區暫存讀取的資料。

net_buffer_size 連線資訊及返回客戶端前結果集暫存使用記憶體
default:16kB 用來存放客戶端連線執行緒的連線資訊和返回客戶端的結果集。當mysql開始產生可以返回的結果集,會在通過
網路返回給客戶端請求執行緒之前,會先暫存在該引數設定的緩衝區中,等滿足一定大小時候才開始向客戶端傳送,
以提高網路傳輸效率。該引數僅是該快取區初始化大小,mysql會根據實際需要自行申請更多記憶體以滿足需求,但
最大不會超過max_allowed_packet大小default:65M

bulk_insert_buffer_size 批量插入暫存使用記憶體
default:65M 當我們使用如insert ..values(),(),()..方式進行批量插入時,會先將提交的資料放入一個快取空間中,當
該快取空間被寫滿或提交完所有資料之後,才會一次性將該快取空間中資料寫入資料庫並清空快取。

tmp_table_size 臨時表使用記憶體 
default:512M 我們進行一些特殊操作使用臨時表才能完成(如:order by ,group by),需超過使用臨時表空間大小,會
建立磁碟臨時表,增加IO操作;
比較理想配置:Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%




所列執行緒獨佔記憶體僅僅只是部分,極端情況下記憶體總體使用量將是所有連線執行緒的總倍數,設定時要注意,過大設定,
會導致記憶體不夠異常,反而降低整體效能.


MySQL 記憶體使用計算如下:
used_Mem = key_buffer_size 
+ query_cache_size 
+ innodb_buffer_pool_size 
+ innodb_additional_mem_pool_size
+ innodb_log_buffer_size
+ max_connections *(
   read_buffer_size 
+ read_rnd_buffer_size
+ sort_buffer_size
+ join_buffer_size
+ binlog_cache_size 
+ thread_stack 
+ tmp_table_size)

SET @giga_bytes=1024*1024*1024;
SELECT (@@key_buffer_size + @@query_cache_size + @@tmp_table_size
+ @innodb_buffer_pool_size + @innodb_additional_mem_pool_size
+ @innodb_log_buffer_size
+ @@max_connections * (
  @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size
+ @@join_buffer_size + @@binlog_cache_size + @thread_stack
) ) / @giga_bytes AS MAX_MEMORY_GB;







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26855487/viewspace-765058/,如需轉載,請註明出處,否則將追究法律責任。

相關文章