全域性共享內則主要是 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佇列等。
mysql共享記憶體 MySQL全域性共享記憶體介紹
前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...
mysql共享記憶體 MySQL全域性共享記憶體介紹
前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...
共享記憶體的使用
http download1.csdn.net down3 20070529 29183222619.chttp download1.csdn.net down3 20070529 29183246962.chttp download1.csdn.net down3 20070529 2918324...