Mysql學習之記憶體詳解

2021-07-26 20:38:34 字數 3321 閱讀 7175

本篇文章是對

mysql記憶體

的使用說明(全域性快取+執行緒快取)進行了詳細的分析介紹,需要的朋友參考下

首先我們來看乙個公式,mysql中記憶體分為全域性記憶體和執行緒記憶體兩大部分(其實並不全部,只是影響比較大的 部分):

複製****如下:

per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_stack+join_buffer_size+binlog_cache_size

+tmp_table_size)*max_connections

global_buffers=

innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+key_buffer_size+query_cache_size

total_memory=global_buffers+per_thread_buffers

全域性快取:

key_buffer_size:決定索引處理的速度,尤其是索引讀的速度。預設值是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表,也要使用該值。可以使用檢查狀態值'created_tmp_disk_tables'得知詳情。

innodb_buffer_pool_size:innodb使用該引數指定大小的記憶體來緩衝資料和索引,這個是innodb引擎中影響效能最大的引數。

innodb_additional_mem_pool_size:指定innodb用來儲存資料字典和其他內部資料結構的記憶體池大小。預設值是8m。通常不用太大,只要夠用就行,應該與表結構的複雜度有關係。如果不夠用,mysql會在錯誤日誌中寫入一條警告資訊。

innodb_log_buffer_size:指定innodb用來儲存日誌資料的快取大小,如果您的表操作中包含大量併發事務(或大規模事務),並且在事務提交前要求記錄日誌檔案,請盡量調高此項值,以提高日誌效率。

query_cache_size:是mysql的查詢緩衝大小。(從4.0.1開始,mysql提供了查詢緩衝機制)使用查詢緩衝,mysql將select語句和查詢結果存放在緩衝區中,今後對於同樣的select語句(區分大小寫),將直接從緩衝區中讀取結果。根據mysql使用者手冊,使用查詢緩衝最多可以達到238%的效率。通過檢查狀態值'qcache_%',可以知道query_cache_size設定是否合理:如果qcache_lowmem_prunes的值非常大,則表明經常出現緩衝不夠的情況,如果qcache_hits的值也非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小;如果qcache_hits的值不大,則表明你的查詢重複率很低,這種情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在select語句中加入sql_no_cache可以明確表示不使用查詢緩衝。

執行緒快取

read_buffer_size:是mysql讀入緩衝區大小。對錶進行順序掃瞄的請求將分配乙個讀入緩衝區,mysql會為它分配一段記憶體緩衝區。read_buffer_size變數控制這一緩衝區的大小。如果對錶的順序掃瞄請求非常頻繁,並且你認為頻繁掃瞄進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能。

sort_buffer_size:是mysql執行排序使用的緩衝大小。如果想要增加order by的速度,首先看是否可以讓mysql使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變數的大小。

read_rnd_buffer_size:是mysql的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配乙個隨機讀快取區。進行排序查詢時,mysql會首先掃瞄一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。但mysql會為每個客戶連線發放該緩衝空間,所以應盡量適當設定該值,以避免記憶體開銷過大。

tmp_table_size:是mysql的臨時表緩衝大小。所有聯合在乙個dml指令內完成,並且大多數聯合甚至可以不用臨時錶即可以完成。大多數臨時表是基於記憶體的(heap)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含blob列的表儲存在硬碟上。如果某個內部heap(堆積)表大小超過tmp_table_size,mysql可以根據需要自動將記憶體中的heap表改為基於硬碟的myisam表。還可以通過設定tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,mysql同時將增加heap表的大小,可達到提高聯接查詢速度的效果。

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

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

binlog_cache_size:在事務過程中容納二進位制日誌sql 語句的快取大小。二進位制日誌快取是伺服器支援事務儲存引擎並且伺服器啟用了二進位制日誌(—log-bin 選項)的前提下為每個客戶端分配的記憶體,注意,是每個client 都可以分配設定大小的binlog cache空間。如果系統中經常會出現多語句事務的話,可以嘗試增加該值的大小,以獲得更好的效能。當然,我們可以通過mysql 的以下兩個狀態變數來判斷當前的binlog_cache_size 的狀況:binlog_cache_use 和binlog_cache_disk_use。「max_binlog_cache_size」:和"binlog_cache_size"相對應,但是所代表的是binlog 能夠使用的最大cache 記憶體大小。當我們執行多語句事務的時候,max_binlog_cache_size 如果不夠大的話,系統可能會報出「 multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage」的錯誤。

其中需要注意的是:table_cache表示的是所有執行緒開啟的表的數目,和記憶體無關。

linux公社

Mysql之記憶體結構

mysql記憶體組成可以分為sga 系統全域性 和pga 程式快取區 引數用途 innodb buffer pool 用來快取innodb表的資料,索引,插入快取,資料字典等資訊 innodb log buffer 即redo log buffer 事務在記憶體中的緩衝 query cache 只能...

mysql之記憶體表

昨天下午老大讓我查資料看一下mysql的記憶體表在主從備份中是否能被複製,我還沒聽說過記憶體表呢,於是上網查資料,記錄一下,以便查閱 學習 參考 記憶體表 複製 session 1 mysql uroot root none 10 05 06 use test database changed ro...

ucos iii學習之記憶體物件

uc os iii 可以獲得連續的記憶體塊,記憶體塊大小可以相同,所有的記憶體分割槽包含了整數個記憶體塊。在特定的時間執行記憶體塊的分配和釋放。記憶體分割槽以記憶體塊陣列的形式被靜態分配的。如果分配後不被釋放,也可以呼叫 malloc 動態分配。1.建立乙個記憶體分割槽 呼叫 osmemcreate...