MySQL原始碼分析(2):Mysql中的記憶體分配相關
Mysql中的記憶體分配相關
- 涉及到記憶體的配置引數
- 這些引數可以分成兩部分,分別對應MySQL中的兩個層次:伺服器層和儲存引擎層。
- MySQL伺服器相關:
每個連線到MySQL伺服器的執行緒都需要有自己的緩衝,預設為其分配256K。事務開始之後,則需要增加更多的空間。執行較小的查詢可能僅給指定的執行緒增加少量的記憶體消耗,例如儲存查詢語句的空間等。但如果對資料表做複雜的操作比較複雜,例如排序則需要使用臨時表,此時會分配大約read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的記憶體空間。不過它們只是在需要的時候才分配,並且在那些操作做完之後就釋放了。
read_buffer_size是MySql讀入緩衝區大小。對錶進行順序掃描的請求將分配一個讀入緩衝區,MySql會為它分配一段記憶體緩衝區。read_buffer_size變數控制這一緩衝區的大小。如果對錶的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能。
sort_buffer_size是MySql執行排序使用的緩衝大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變數的大小。該變數會監測sort_merge_passed, sort_range, sort_rows, sort_scan的狀況。通常較小的sort_merge_passed效能越高,但是也與workload的特性有關。
read_rnd_buffer_size是MySql的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀快取區。進行排序查詢時,MySql會首先掃描一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。但MySql會為每個客戶連線發放該緩衝空間,所以應儘量適當設定該值,以避免記憶體開銷過大。
query_cache_size是MySql的查詢緩衝大小。(從4.0.1開始,MySQL提供了查詢緩衝機制)使用查詢緩衝,MySQL將SELECT語句和查詢結果存放在緩衝區中,今後對於同樣的SELECT語句(區分大小寫),將直接從緩衝區中讀取結果。根據MySQL使用者手冊,使用查詢緩衝最多可以達到238%的效率。
此外還有每個連線中會使用的一些變數會消耗少量記憶體。
MyISAM引擎相關key_buffer_size儲存了所有index的快取,一般我們設為16M,通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設定是否合理。比例key_reads / key_read_requests應該儘可能的低,至少是1:100,1:1000更好(上述狀態值可以使用'key_read%'獲得用來顯示狀態資料)。key_buffer_size只對MyISAM表起作用。即使不使用MyISAM儲存引擎,但是內部的臨時磁碟表是MyISAM表,故也要使用該值。
InnoDB引擎相關innodb_buffer_pool_size對於InnoDB表來說,作用就相當於key_buffer_size對於MyISAM表的作用一樣。InnoDB使用該引數指定大小的記憶體來緩衝資料和索引。對於單獨的MySQL資料庫伺服器,手冊上推薦把該值設定成實體記憶體的80%。
innodb_additional_mem_pool_size指定InnoDB用來儲存資料字典和其他內部資料結構的記憶體池大小。預設值是1M。通常不用太大,只要夠用就行,應該與表結構的複雜度有關係。如果不夠用,MySQL會在錯誤日誌中寫入一條警告資訊。
innodb_log_buffer_size指定InnoDB用來儲存日誌資料的快取大小,如果您的表操作中包含大量併發事務(或大規模事務),並且在事務提交前要求記錄日誌檔案,請儘量調高此項值,以提高日誌效率。
-
Table_open_cache
Sort_buffer_size
Read_buffer_size
Net_buffer_length
Read_rnd_buffer_size
Innodb_buffer_pool_size
Innodb_additional_mem_pool_size
Innodb_log_buffer_size
Query_cache_size Mysql中最小記憶體佔用公式-
innodb buffer pool
innodb log buffer
innodb additional mempool
net buffer-
myisam sort buffer
read buffer
join buffer
readrnd bufferminmemoryneeded = globalbuffers + (threadbuffers * max_connections)
其中globalbuffers 包括:
threadbuffers 包括: