mysql 緩衝區 mysql 執行緒級別的緩衝區

2021-10-17 12:50:58 字數 2271 閱讀 8098

執行緒棧資訊使用記憶體(thread_stack)

主要用來存放每乙個執行緒自身的標識資訊,如執行緒id,執行緒執行時基本資訊等等,我們可以通過 thread_stack 引數來設定為每乙個執行緒棧分配多大的記憶體。

排序使用記憶體(sort_buffer_size)

mysql 用此記憶體區域進行排序操作(filesort),完成客戶端的排序請求。當我們設定的排序區快取大小無法滿足排序實際所需記憶體的時候,mysql 會將資料寫入磁碟檔案來完成排序。由於磁碟和記憶體的讀寫效能完全不在乙個數量級,所以sort_buffer_size引數對排序操作的效能影響絕對不可小視。經常使用索引來完成排序操作。

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 訪問,降低效率。

順序讀取資料緩衝區使用記憶體(read_buffer_size)

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

隨機讀取資料緩衝區使用記憶體(read_rnd_buffer_size)

和順序讀取相對應,當 mysql 進行非順序讀取(隨機讀取)資料塊的時候,會利用這個緩衝區暫存讀取的資料。如根據索引資訊讀取表資料,根據排序後的結果集與表進行join等等。總的來說,就是當資料塊的讀取需要滿足一定的順序的情況下,mysql 就需要產生隨機讀取,進而使用到 read_rnd_buffer_size 引數所設定的記憶體緩衝區。

連線資訊及返回客戶端前結果集暫存使用記憶體(net_buffer_size)

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

批量插入暫存使用記憶體(bulk_insert_buffer_size)

當我們使用如 insert … values(…),(…),(…)… 的方式進行批量插入的時候,mysql 會先將提交的資料放如乙個快取空間中,當該快取空間被寫滿或者提交完所有資料之後,mysql 才會一次性將該快取空間中的資料寫入資料庫並清空快取。此外,當我們進行 load data infile 操作來將文字檔案中的資料 load 進資料庫的時候,同樣會使用到此緩衝區。

臨時表使用記憶體(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。

總結上面所列舉的 mysql 執行緒獨享記憶體僅僅只是所有執行緒獨享記憶體中的部分,並不是全部,選擇的原則是可能對 mysql 的效能產生較大的影響,且可以通過系統引數進行調節。

由於以上記憶體都是執行緒獨享,極端情況下的記憶體總體使用量將是所有連線線程的總倍數。所以各位朋友在設定過程中一定要謹慎,切不可為了提公升效能就盲目的增大各引數值,避免因為記憶體不夠而產生 out of memory 異常或者是嚴重的 swap 交換反而降低整體效能。

執行緒以及緩衝區

size medium 1.執行緒 我們把正在計算機中執行的程式叫做 程序 所謂 執行緒 是 程序 中某個單一順序的控制流。在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。通俗的說法,之前編的程式如果乙個指令沒進行完,則不能進行下乙個指令,或者不能關閉視窗。利用多執行緒,可以完成多個指令...

mysql 快取區 MYSQL緩衝區和快取設定

mysql緩衝區和快取設定 mysql 支援超過 100 個的可調節設定 但是幸運的是,掌握少數幾個就可以滿足大部分需要。查詢這些設定的正確值可以通過 show status 命令檢視狀態變數,從中可以確定 mysqld 的運作情況是否符合我們的預期。給緩衝區和快取分配的記憶體不能超過系統中的現有記...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...