MySQL記憶體使用量之全域共用

來源:互聯網
上載者:User

全域共用記憶體主要是 MySQL Instancemysqld進程)以及底層儲存引擎用來暫存各種全域運算及可共用的暫存資訊,如儲存查詢快取的 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隊列等。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.