mysql記憶體使用分析 二

2022-04-08 13:17:34 字數 4424 閱讀 7494

author:skate

time:2012/02/16

mysql記憶體使用分析  

2.全域性共享記憶體

全域性共享內則主要是mysql instance(mysqld程序)以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的query cache,快取連線線程的thread cache,快取表檔案控制代碼資訊的table cache,快取二進位制日誌的binlog buffer, 快取myisam 儲存引擎索引鍵的key buffer以及儲存innodb 資料和索引的innodb buffer pool 等等。下面針對mysql 主要的共享記憶體進行乙個簡單的分析。

查詢快取(query cache):

查詢快取是mysql 比較獨特的乙個快取區域,用來快取特定query 的結果集(result set)資訊,且共享給所有客戶端。通過對query 語句進行特定的hash 計算之後與結果集對應存放在query cache 中,以提高完全相同的query 語句的相應速度。當我們開啟mysql 的query cache 之後,mysql 接收到每乙個select 型別的query 之後都會首先通過固定的hash 演算法得到該query 的hash 值,然後到query cache 中查詢是否有對應的query cache。如果有,則直接將cache 的結果集返回給客戶端。如果沒有,再進行後續操作,得到對應的結果集之後將該結果集快取到query cache 中,再返回給客戶端。當任何乙個表的資料發生任何變化之後,與該錶相關的所有query cache 全部會失效,所以query cache 對變更比較頻繁的表並不是非常適用,但對那些變更較少的表是非常合適的,可以極大程度的提高查詢效率,如那些靜態資源表,配置表等等。為了盡可能高效的利用query cache,mysql 針對query cache 設計了多個query_cache_type 值和兩個query hint:sql_cache 和sql_no_cache。當query_cache_type 設定為0(或者off)的時候不使用query cache,當設定為1(或者on)的時候,當且僅當query 中使用了sql_no_cache 的時候mysql 會忽略query cache,當query_cache_type 設定為2(或者demand)的時候,當且僅當query 中使用了sql_cache 提示之後,mysql 才會針對該query 使用query cache。可以通過query_cache_size 來設定可以使用的最大記憶體空間。

連線線程快取(thread cache):

連線線程是mysql 為了提高建立連線線程的效率,將部分空閒的連線線程保持在乙個快取區以備新進連線請求的時候使用,這尤其對那些使用短連線的應用程式來說可以極大的提高建立連線的效率。當我們通過thread_cache_size 設定了連線線程快取池可以快取的連線線程的大小之後,可以通過(connections - threads_created) / connections * 100% 計算出連線線程快取的命中率。注意,這裡設定的是可以快取的連線線程的數目,而不是記憶體空間的大小。

表快取(table cache):

表快取區主要用來快取表檔案的檔案控制代碼資訊,在mysql5.1.3之前的版本通過table_cache 引數設定,但從mysql5.1.3開始改為table_open_cache 來設定其大小。當我們的客戶端程式提交query 給mysql 的時候,mysql 需要對query 所涉及到的每乙個表都取得乙個表檔案控制代碼資訊,如果沒有table cache,那麼mysql 就不得不頻繁的進行開啟關閉檔案操作,無疑會對系統效能產生一定的影響,table cache 正是為了解決這一問題而產生的。在有了table cache 之後,mysql 每次需要獲取某個表檔案的控制代碼資訊的時候,首先會到table cache 中查詢是否存在空閒狀態的表檔案控制代碼。如果有,則取出直接使用,沒有的話就只能進行開啟檔案操作獲得檔案控制代碼資訊。在使用完之後,mysql 會將該檔案控制代碼資訊再放回table cache 池中,以供其他執行緒使用。注意,這裡設定的是可以快取的表檔案控制代碼資訊的數目,而不是記憶體空間的大小。

表定義資訊快取(table definition cache):

表定義資訊快取是從mysql5.1.3 版本才開始引入的乙個新的快取區,用來存放表定義資訊。當我們的mysql 中使用了較多的表的時候,此快取無疑會提高對錶定義資訊的訪問效率。mysql 提供了table_definition_cache 引數給我們設定可以快取的表的數量。在mysql5.1.25 之前的版本中,預設值為128,從mysql5.1.25 版本開始,則將預設值調整為256 了,最大設定值為524288。注意,這裡設定的是可以快取的表定義資訊的數目,而不是記憶體空間的大小。

二進位制日誌緩衝區(binlog buffer):

二進位制日誌緩衝區主要用來快取由於各種資料變更操做所產生的binary log 資訊。為了提高系統的效能,mysql 並不是每次都是將二進位制日誌直接寫入log file,而是先將資訊寫入binlog buffer 中,當滿足某些特定的條件(如sync_binlog引數設定)之後再一次寫入log file 中。我們可以通過binlog_cache_size 來設定其可以使用的記憶體大小,同時通過max_binlog_cache_size 限制其最大大小(當單個事務過大的時候mysql 會申請更多的記憶體)。當所需記憶體大於max_binlog_cache_size 引數設定的時候,mysql 會報錯:「multi-statement transaction required more than 『max_binlog_cache_size』bytes of storage」。

myisam索引快取(key buffer):

myisam 索引快取將myisam 表的索引資訊快取在記憶體中,以提高其訪問效能。這個快取可以說是影響myisam 儲存引擎效能的最重要因素之一了,通過key_buffere_size 設定可以使用的最大記憶體空間。

innodb 日誌緩衝區(innodb log buffer):

這是innodb 儲存引擎的事務日誌所使用的緩衝區。類似於binlog buffer,innodb 在寫事務日誌的時候,為了提高效能,也是先將資訊寫入innofb log buffer 中,當滿足innodb_flush_log_trx_commit 引數所設定的相應條件(或者日誌緩衝區寫滿)之後,才會將日誌寫到檔案(或者同步到磁碟)中。可以通過innodb_log_buffer_size 引數設定其可以使用的最大記憶體空間。

注:innodb_flush_log_trx_commit 引數對innodb log 的寫入效能有非常關鍵的影響。該引數可以設定為0,1,2,解釋如下:  

0:log buffer中的資料將以每秒一次的頻率寫入到log file中,且同時會進行檔案系統到磁碟的同步操作,但是每個事務的commit並不會觸發任何log buffer 到log file的重新整理或者檔案系統到磁碟的重新整理操作;

1:在每次事務提交的時候將log buffer 中的資料都會寫入到log file,同時也會觸發檔案系統到磁碟的同步;

2:事務提交會觸發log buffer 到log file的重新整理,但並不會觸發磁碟檔案系統到磁碟的同步。此外,每秒會有一次檔案系統到磁碟同步操作。

此外,mysql文件中還提到,這幾種設定中的每秒同步一次的機制,可能並不會完全確保非常準確的每秒就一定會發生同步,還取決於程序排程的問題。實際上,innodb 能否真正滿足此引數所設定值代表的意義正常recovery 還是受到了不同os 下檔案系統以及磁碟本身的限制,可能有些時候在並沒有真正完成磁碟同步的情況下也會告訴mysqld 已經完成了磁碟同步。

innodb 資料和索引快取(innodb buffer pool):

innodb buffer pool 對innodb 儲存引擎的作用類似於key buffer cache 對myisam 儲存引擎的影響,主要的不同在於innodb buffer pool 不僅僅快取索引資料,還會快取表的資料,而且完全按照資料檔案中的資料快結構資訊來快取,這一點和oracle sga 中的database buffer cache 非常類似。所以,innodb buffer pool 對innodb 儲存引擎的效能影響之大就可想而知了。可以通過(innodb_buffer_pool_read_requests - innodb_buffer_pool_reads) / innodb_buffer_pool_read_requests * 100% 計算得到innodb buffer pool 的命中率。

innodb 字典資訊快取(innodb additional memory pool):

innodb 字典資訊快取主要用來存放innodb 儲存引擎的字典資訊以及一些internal 的共享資料結構資訊。所以其大小也與系統中所使用的innodb 儲存引擎表的數量有較大關係。不過,如果我們通過innodb_additional_mem_pool_size 引數所設定的記憶體大小不夠,innodb 會自動申請更多的記憶體,並在mysql 的error log 中記錄警告資訊。

這裡所列舉的各種共享記憶體,是對mysql 效能有較大影響的集中主要的共享記憶體。實際上,除了這些共享記憶體之外,mysql 還存在很多其他的共享記憶體資訊,如當同時請求連線過多的時候用來存放連線請求資訊的back_log佇列等。  

------end-----

mysql 記憶體使用 mysql記憶體使用分析 一

author skate time 2012 02 16 mysql記憶體使用分析 從記憶體的使用方式來說,mysql的記憶體使用主要分為以下兩類 1.執行緒獨享記憶體 2.全域性共享記憶體 1.執行緒獨享記憶體 在mysql 中,執行緒獨享記憶體主要用於各客戶端連線線程儲存各種操作的獨享資料,如執...

mysql記憶體使用分析 一

author skate time 2012 02 16 mysql記憶體使用分析 從記憶體的使用方式來說,mysql資料庫的記憶體使用主要分為以下兩類 1.執行緒獨享記憶體 2.全域性共享記憶體 1.執行緒獨享記憶體 在mysql 中,執行緒獨享記憶體主要用於各客戶端連線線程儲存各種操作的獨享資料...

Mysql 記憶體使用

在這裡我們將介紹的是mysql記憶體使用上的執行緒獨享,執行緒獨享記憶體主要用於各客戶端連線線程儲存各種操作的獨享資料,如執行緒棧資訊,分組排序操作,資料讀寫緩衝,結果集暫存等等,而且大多數可以通過相關引數來控制記憶體的使用量。對於任何乙個資料庫管理系統來說,記憶體的分配使用絕對可以算的上是其核心之...