Innodb之線程獨享內存

引用連接:mysql

https://blog.csdn.net/miyatang/article/details/54881547

https://blog.csdn.net/wyzxg/article/details/7700394?utm_source=copysql

https://blog.csdn.net/qq_27529917/article/details/78454947數據庫

 

線程獨享內存:緩存

線程棧信息使用內存(thread_stack)

排序使用內存(sort_buffer_size)網絡

Join操做使用內存(join_buffer_size)性能

順序讀取數據緩衝區使用內存(read_buffer_size)ui

隨機讀取數據緩衝區使用內存(read_rnd_buffer_size)spa

鏈接信息及返回客戶端前結果集暫存使用內存(net_buffer_length).net

批量插入暫存使用內存(bulk_insert_buffer_size)線程

臨時表使用內存(tmp_table_size)

緩存二進制日誌的(binlog_cache_size)

線程內存分配總和:

 All thread buffer(會話/線程級內存分配總和) =

max_threads(當前活躍鏈接數) * (

read_buffer_size -- 順序讀緩衝,提升順序讀效率

+read_rnd_buffer_size -- 隨機讀緩衝,提升隨機讀效率

+sort_buffer_size -- 排序緩衝,提升排序效率

+join_buffer_size -- 錶鏈接緩衝,提升錶鏈接效率

+binlog_cache_size -- 二進制日誌緩衝,提升二進制日誌寫入效率

+tmp_table_size -- 內存臨時表,提升臨時表存儲效率

+thread_stack -- 線程堆棧,暫時寄存SQL語句/存儲過程

+thread_cache_size -- 線程緩存,下降屢次反覆打開線程開銷

+net_buffer_length -- 線程持鏈接緩衝以及讀取結果緩衝

+bulk_insert_buffer_size -- MyISAM表批量寫入數據緩衝

)


線程獨享內存的做用:

MySQL中,線程獨享內存主要用於各客戶端鏈接線程存儲各類操做的獨享數據,如線程棧信息,分組排序操做,數據讀寫緩衝,結果集暫存等等,並且大多數能夠經過相關參數來控制內存的使用量。

1線程棧信息使用內存(thread_stack)

主要用來存放每個線程自身的標識信息,如線程id,線程運行時基本信息等等,咱們能夠過thread_stack 參數來設置爲每個線程棧分配多大的內存。

參數:thread_stack         ---Global,No Dynamic,Default 192K(32bit), 256K(32bit),

推薦配置:默認

 

2排序使用內存(sort_buffer_size)

MySQL用此內存區域進行排序操做(filesort),完成客戶端的排序請求。當咱們設置的排序區緩存大小沒法知足排序實際所需內存的時候,MySQL會將數據寫入磁盤文件來完成排序。因爲磁盤和內存的讀寫性能徹底不在一個數量級,因此sort_buffer_size參數對排序操做的性能影響絕對不可小視。

能夠經過查詢計劃中的Extra列的值爲Using file-sort來證明使用了和這個緩衝區。

>explain select * from user1;

參數:sort_buffer_size   -----Global Session,Dynamic,Default 2M(32bit)

推薦配置:8M(內存足夠的狀況下),默認(內存緊張的狀況)

 

3 Join操做使用內存(join_buffer_size)

應用程序常常會出現一些兩表(或多表)Join的操做需求,MySQL在完成某些Join需求的時候(all/index join),爲了減小參與Join的「被驅動表」的讀取次數以提升性能,須要使用到Join Buffer來協助完成Join操做。。當Join Buffer過小,MySQL 不會將該Buffer存入磁盤文件,而是先將Join Buffer中的結果集與須要Join的表進行Join操做,而後清空Join Buffer中的數據,繼續將剩餘的結果集寫入此Buffer中,如此往復。這勢必會形成被驅動表須要被屢次讀取,成倍增長IO訪問,下降效率。

何時會用到?

當查詢必須鏈接兩個表(或多個)的數據集而且不能使用索引時,這個緩衝區會被用到。這個緩衝區專門爲每一個線程的無索引連接操做準備的。

使用確認: 能夠經過查詢計劃中的Extra列的值爲Using join bufer來證明使用了和這個緩衝區。

>explain select * from user1;

參數:join_buffer_size     --Global Session,Dynamic,Default 128K 各版本平臺最大值不同

 

4順序讀取數據緩衝區使用內存(read_buffer_size)

這部份內存主要用於當須要順序讀取數據的時候,如沒法使用索引的狀況下的全表掃描,全索引掃描等。在這種時候,MySQL按照數據的存儲順序依次讀取數據塊,每次讀取的數據快首先會暫存在read_buffer_size中,buffer空間被寫滿或者所有數據讀取結束後,再將buffer中的數據返回給上層調用者,以提升效率。

參數:read_buffer_size      ----Global Session,Dynamic,Default 128K

推薦配置:4M/8M

 

5隨機讀取數據緩衝區使用內存(read_rnd_buffer_size)

和順序讀取相反,當MySQL進行非順序讀取(隨機讀取)數據塊的時候,會利用這個緩衝區暫存讀取的數據。如根據索引信息讀取表數據,根據排序後的結果集與表進行Join等等。總的來講,就是當數據塊的讀取須要知足必定的順序的狀況下,MySQL就須要產生隨機讀取,進而使用到read_rnd_buffer_size 參數所設置的內存緩衝區。

參數:read_rnd_buffer_size    -----Global Session,Dynamic,Default 256K

推薦配置:8M

 

6鏈接信息及返回客戶端前結果集暫存使用內存(net_buffer_length)

這部分用來存放客戶端鏈接線程的鏈接信息和返回客戶端的結果集。當MySQL開始產生能夠返回的結果集,會在經過網絡返回給客戶端請求線程以前,會先暫存在經過net_buffer_length所設置的緩衝區中,等知足必定大小的時候纔開始向客戶端發送,以提升網絡傳輸效率。不過net_buffer_lenth參數所設置的僅僅只是該緩存區的初始化大小,MySQL會根據實際須要自行申請更多的內存以知足需求,但最大不會過max_allowed_packet參數大小。
參數:
net_buffer_length   ----Global Session,Dynamic,Default 16K

推薦配置:默認 16K

 

7. 批量插入暫存使用內存(bulk_insert_buffer_size)
當咱們使用如insert … values(),(),()… 的方式進行批量插入的時候,MySQL會先將提交的數據放如一個緩存空間中,當該緩存空間被寫滿或者提交完全部數據以後,MySQL纔會一次性將該緩存空間中的數據寫入數據庫並清空緩存。此外,當咱們進行 LOAD DATA INFILE操做來將文本文件中的數據Load進數據庫的時候,一樣會使用到此緩衝區。

參數:bulk_insert_buffer_size      ----Global Session,Dynamic,Default 8M

推薦配置:默認 8M

 

8.臨時表使用內存(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

推薦配置:64M

能夠經過MySQL狀態變量created_tmp_tablescreated_tmp_disk_tables來肯定建立了臨時表和基於磁盤的臨時表

mysql> show global status like 'create%tables';

+-------------------------+-------+

| Variable_name           | Value |

+-------------------------+-------+

| Created_tmp_disk_tables | 0     |

| Created_tmp_tables      | 17    |

 

+-------------------------+-------+

5.5中,可使用PERFORMANCESCHEMA來幫助統計基於磁盤的臨時表的總大小

9. 二進制日誌緩衝區Binlog Cache( binlog_cache_size

 二進制日誌緩衝區主要用來緩存因爲各類數據變動操作所產生的 binary Log 信息。爲了提升系統的性能,MySQL 並非每次都是將二進制日誌直接寫入 Log File,而是先將信息寫入 Binlog Buffer 中,當知足某些特定的條件(如sync_binlog參數設置)以後再一次寫入 Log File 中。咱們能夠經過 binlog_cache_size 來設置其可使用的內存大小,同時經過 max_binlog_cache_size 限制其最大大小

參數: binlog_cache_size、max_binlog_cache_size     -----Global,Dynamic,Default 32K

 推薦配置:2M

查看語句:mysql> show global status like 'bin%';

Binlog_cache_disk_use表示由於咱們binlog_cache_size設計的內存不足致使緩存二進制日誌用到了臨時文件的次數。Binlog_cache_use  表示 用binlog_cache_size緩存的次數,當對應的Binlog_cache_disk_use 值比較大的時候, 咱們能夠考慮適當的調高, binlog_cache_size 對應的值。

 

說明:當單個事務過大的時候 MySQL會申請更多的內存。當所需內存大於 max_binlog_cache_size 參數設置的時候,MySQL 會報錯:「Multi-statement transaction required more than max_binlog_cache_size’ bytes of storage」。

 

 

 

 

 

 

補充說明:上面所列舉的MySQL線程獨享內存僅僅只是全部線程獨享內存中的部分,並非所有,只是這些可能對MySQL的性能產生較大的影響,且能夠經過系統參數進行調節。因爲以上內存都是線程獨享,極端狀況下的內存整體使用量將是全部鏈接線程的總倍數。因此在設置過程當中必定要謹慎,切不可爲了提高性能就盲目的增大各參數值,避免由於內存不夠而產生Out Of Memory異常或者是嚴重的Swap交換反而下降總體性能。

相關文章
相關標籤/搜索