引用連接: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 |
當咱們使用如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_tables和created_tmp_disk_tables來肯定建立了臨時表和基於磁盤的臨時表 mysql> show global status like 'create%tables'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 17 |
+-------------------------+-------+ 5.5中,可使用PERFORMANCE—SCHEMA來幫助統計基於磁盤的臨時表的總大小 |
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交換反而下降總體性能。