欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL全局共享內(nèi)存介紹

 更新時(shí)間:2014年12月01日 10:43:01   投稿:junjie  
這篇文章主要介紹了MySQL全局共享內(nèi)存介紹,全局共享內(nèi)存則主要是 MySQL Instance(mysqld進(jìn)程)以及底層存儲(chǔ)引擎用來(lái)暫存各種全局運(yùn)算及可共享的暫存信息,如存儲(chǔ)查詢緩存的 Query Cache,緩存連接線程的 Thread Cache等等,需要的朋友可以參考下

前言

全局共享內(nèi)存則主要是 MySQL Instance(mysqld進(jìn)程)以及底層存儲(chǔ)引擎用來(lái)暫存各種全局運(yùn)算及可共享的暫存信息,如存儲(chǔ)查詢緩存的 Query Cache,緩存連接線程的 Thread Cache,緩存表文件句柄信息的 Table Cache,緩存二進(jìn)制日志的 BinLog Buffer, 緩存 MyISAM 存儲(chǔ)引擎索引鍵的 Key Buffer以及存儲(chǔ) InnoDB 數(shù)據(jù)和索引的 InnoDB Buffer Pool 等等。下面針對(duì) MySQL 主要的共享內(nèi)存進(jìn)行一個(gè)簡(jiǎn)單的分析。

查詢緩存(Query Cache)

查詢緩存是 MySQL 比較獨(dú)特的一個(gè)緩存區(qū)域,用來(lái)緩存特定 Query 的結(jié)果集(Result Set)信息,且共享給所有客戶端。通過(guò)對(duì) Query 語(yǔ)句進(jìn)行特定的 Hash 計(jì)算之后與結(jié)果集對(duì)應(yīng)存放在 Query Cache 中,以提高完全相同的 Query 語(yǔ)句的相應(yīng)速度。當(dāng)我們打開 MySQL 的 Query Cache 之后,MySQL 接收到每一個(gè) SELECT 類型的 Query 之后都會(huì)首先通過(guò)固定的 Hash 算法得到該 Query 的 Hash 值,然后到 Query Cache 中查找是否有對(duì)應(yīng)的 Query Cache。如果有,則直接將 Cache 的結(jié)果集返回給客戶端。如果沒有,再進(jìn)行后續(xù)操作,得到對(duì)應(yīng)的結(jié)果集之后將該結(jié)果集緩存到 Query Cache 中,再返回給客戶端。當(dāng)任何一個(gè)表的數(shù)據(jù)發(fā)生任何變化之后,與該表相關(guān)的所有 Query Cache 全部會(huì)失效,所以 Query Cache 對(duì)變更比較頻繁的表并不是非常適用,但對(duì)那些變更較少的表是非常合適的,可以極大程度的提高查詢效率,如那些靜態(tài)資源表,配置表等等。為了盡可能高效的利 用 Query Cache,MySQL 針對(duì) Query Cache 設(shè)計(jì)了多個(gè) query_cache_type 值和兩個(gè) Query Hint:SQL_CACHE 和 SQL_NO_CACHE。當(dāng) query_cache_type 設(shè)置為0(或者 OFF)的時(shí)候不使用 Query Cache,當(dāng)設(shè)置為1(或者 ON)的時(shí)候,當(dāng)且僅當(dāng) Query 中使用了 SQL_NO_CACHE 的時(shí)候 MySQL 會(huì)忽略 Query Cache,當(dāng) query_cache_type 設(shè)置為2(或者DEMAND)的時(shí)候,當(dāng)且僅當(dāng)Query 中使用了 SQL_CACHE 提示之后,MySQL 才會(huì)針對(duì)該 Query 使用 Query Cache。可以通過(guò) query_cache_size 來(lái)設(shè)置可以使用的最大內(nèi)存空間。

連接線程緩存(Thread Cache)

連接線程是 MySQL 為了提高創(chuàng)建連接線程的效率,將部分空閑的連接線程保持在一個(gè)緩存區(qū)以備新進(jìn)連接請(qǐng)求的時(shí)候使用,這尤其對(duì)那些使用短連接的應(yīng)用程序來(lái)說(shuō)可以極大的提高創(chuàng) 建連接的效率。當(dāng)我們通過(guò) thread_cache_size 設(shè)置了連接線程緩存池可以緩存的連接線程的大小之后,可以通過(guò)(Connections - Threads_created) / Connections * 100% 計(jì)算出連接線程緩存的命中率。注意,這里設(shè)置的是可以緩存的連接線程的數(shù)目,而不是內(nèi)存空間的大小。

表緩存(Table Cache)

表緩存區(qū)主要用來(lái)緩存表文件的文件句柄信息,在 MySQL5.1.3之前的版本通過(guò) table_cache 參數(shù)設(shè)置,但從MySQL5.1.3開始改為 table_open_cache 來(lái)設(shè)置其大小。當(dāng)我們的客戶端程序提交 Query 給 MySQL 的時(shí)候,MySQL 需要對(duì) Query 所涉及到的每一個(gè)表都取得一個(gè)表文件句柄信息,如果沒有 Table Cache,那么 MySQL 就不得不頻繁的進(jìn)行打開關(guān)閉文件操作,無(wú)疑會(huì)對(duì)系統(tǒng)性能產(chǎn)生一定的影響,Table Cache 正是為了解決這一問(wèn)題而產(chǎn)生的。在有了 Table Cache 之后,MySQL 每次需要獲取某個(gè)表文件的句柄信息的時(shí)候,首先會(huì)到 Table Cache 中查找是否存在空閑狀態(tài)的表文件句柄。如果有,則取出直接使用,沒有的話就只能進(jìn)行打開文件操作獲得文件句柄信息。在使用完之后,MySQL 會(huì)將該文件句柄信息再放回 Table Cache 池中,以供其他線程使用。注意,這里設(shè)置的是可以緩存的表文件句柄信息的數(shù)目,而不是內(nèi)存空間的大小。

表定義信息緩存(Table definition Cache)

表定義信息緩存是從 MySQL5.1.3 版本才開始引入的一個(gè)新的緩存區(qū),用來(lái)存放表定義信息。當(dāng)我們的 MySQL 中使用了較多的表的時(shí)候,此緩存無(wú)疑會(huì)提高對(duì)表定義信息的訪問(wèn)效率。MySQL 提供了 table_definition_cache 參數(shù)給我們?cè)O(shè)置可以緩存的表的數(shù)量。在 MySQL5.1.25 之前的版本中,默認(rèn)值為128,從 MySQL5.1.25 版本開始,則將默認(rèn)值調(diào)整為 256 了,最大設(shè)置值為524288。注意,這里設(shè)置的是可以緩存的表定義信息的數(shù)目,而不是內(nèi)存空間的大小。

二進(jìn)制日志緩沖區(qū)(Binlog Buffer)

二進(jìn)制日志緩沖區(qū)主要用來(lái)緩存由于各種數(shù)據(jù)變更操做所產(chǎn)生的 Binary Log 信息。為了提高系統(tǒng)的性能,MySQL 并不是每次都是將二進(jìn)制日志直接寫入 Log File,而是先將信息寫入 Binlog Buffer 中,當(dāng)滿足某些特定的條件(如 sync_binlog參數(shù)設(shè)置)之后再一次寫入 Log File 中。我們可以通過(guò) binlog_cache_size 來(lái)設(shè)置其可以使用的內(nèi)存大小,同時(shí)通過(guò) max_binlog_cache_size 限制其最大大?。ó?dāng)單個(gè)事務(wù)過(guò)大的時(shí)候 MySQL 會(huì)申請(qǐng)更多的內(nèi)存)。當(dāng)所需內(nèi)存大于 max_binlog_cache_size 參數(shù)設(shè)置的時(shí)候,MySQL 會(huì)報(bào)錯(cuò):“Multi-statement transaction required more than ‘max_binlog_cache_size' bytes of storage”。

MyISAM索引緩存(Key Buffer)

MyISAM 索引緩存將 MyISAM 表的索引信息緩存在內(nèi)存中,以提高其訪問(wèn)性能。這個(gè)緩存可以說(shuō)是影響 MyISAM 存儲(chǔ)引擎性能的最重要因素之一了,通過(guò) key_buffere_size 設(shè)置可以使用的最大內(nèi)存空間。

InnoDB 日志緩沖區(qū)(InnoDB Log Buffer)

這是 InnoDB 存儲(chǔ)引擎的事務(wù)日志所使用的緩沖區(qū)。類似于 Binlog Buffer,InnoDB 在寫事務(wù)日志的時(shí)候,為了提高性能,也是先將信息寫入 Innofb Log Buffer 中,當(dāng)滿足 innodb_flush_log_trx_commit 參數(shù)所設(shè)置的相應(yīng)條件(或者日志緩沖區(qū)寫滿)之后,才會(huì)將日志寫到文件(或者同步到磁盤)中。可以通過(guò) innodb_log_buffer_size 參數(shù)設(shè)置其可以使用的最大內(nèi)存空間。
注:innodb_flush_log_trx_commit 參數(shù)對(duì) InnoDB Log 的寫入性能有非常關(guān)鍵的影響。該參數(shù)可以設(shè)置為0,1,2,解釋如下:
* 0:log buffer中的數(shù)據(jù)將以每秒一次的頻率寫入到log file中,且同時(shí)會(huì)進(jìn)行文件系統(tǒng)到磁盤的同步操作,但是每個(gè)事務(wù)的commit并不會(huì)觸發(fā)任何log buffer 到log file的刷新或者文件系統(tǒng)到磁盤的刷新操作;
* 1:在每次事務(wù)提交的時(shí)候?qū)og buffer 中的數(shù)據(jù)都會(huì)寫入到log file,同時(shí)也會(huì)觸發(fā)文件系統(tǒng)到磁盤的同步;
* 2:事務(wù)提交會(huì)觸發(fā)log buffer 到log file的刷新,但并不會(huì)觸發(fā)磁盤文件系統(tǒng)到磁盤的同步。此外,每秒會(huì)有一次文件系統(tǒng)到磁盤同步操作。

此 外,MySQL文檔中還提到,這幾種設(shè)置中的每秒同步一次的機(jī)制,可能并不會(huì)完全確保非常準(zhǔn)確的每秒就一定會(huì)發(fā)生同步,還取決于進(jìn)程調(diào)度的問(wèn)題。實(shí)際 上,InnoDB 能否真正滿足此參數(shù)所設(shè)置值代表的意義正常 Recovery 還是受到了不同 OS 下文件系統(tǒng)以及磁盤本身的限制,可能有些時(shí)候在并沒有真正完成磁盤同步的情況下也會(huì)告訴 mysqld 已經(jīng)完成了磁盤同步。

InnoDB 數(shù)據(jù)和索引緩存(InnoDB Buffer Pool)

InnoDB Buffer Pool 對(duì) InnoDB 存儲(chǔ)引擎的作用類似于 Key Buffer Cache 對(duì) MyISAM 存儲(chǔ)引擎的影響,主要的不同在于 InnoDB Buffer Pool 不僅僅緩存索引數(shù)據(jù),還會(huì)緩存表的數(shù)據(jù),而且完全按照數(shù)據(jù)文件中的數(shù)據(jù)快結(jié)構(gòu)信息來(lái)緩存,這一點(diǎn)和 Oracle SGA 中的 database buffer cache 非常類似。所以,InnoDB Buffer Pool 對(duì) InnoDB 存儲(chǔ)引擎的性能影響之大就可想而知了。可以通過(guò) (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計(jì)算得到 InnoDB Buffer Pool 的命中率。

InnoDB 字典信息緩存(InnoDB Additional Memory Pool)

InnoDB 字典信息緩存主要用來(lái)存放 InnoDB 存儲(chǔ)引擎的字典信息以及一些 internal 的共享數(shù)據(jù)結(jié)構(gòu)信息。所以其大小也與系統(tǒng)中所使用的 InnoDB 存儲(chǔ)引擎表的數(shù)量有較大關(guān)系。不過(guò),如果我們通過(guò)innodb_additional_mem_pool_size 參數(shù)所設(shè)置的內(nèi)存大小不夠,InnoDB 會(huì)自動(dòng)申請(qǐng)更多的內(nèi)存,并在 MySQL 的 Error Log 中記錄警告信息。

這里所列舉的各種共享內(nèi)存,是我個(gè)人認(rèn)為對(duì) MySQL 性能有較大影響的集中主要的共享內(nèi)存。實(shí)際上,除了這些共享內(nèi)存之外,MySQL 還存在很多其他的共享內(nèi)存信息,如當(dāng)同時(shí)請(qǐng)求連接過(guò)多的時(shí)候用來(lái)存放連接請(qǐng)求信息的back_log隊(duì)列等。

以上內(nèi)容可能存在分析不妥之處,歡迎各位朋友拍磚,一起交流。

相關(guān)文章

  • 關(guān)于mysql中時(shí)間日期類型和字符串類型的選擇

    關(guān)于mysql中時(shí)間日期類型和字符串類型的選擇

    大家好,本篇文章主要講的是關(guān)于mysql中時(shí)間日期類型和字符串類型的選擇,感興趣的朋友趕快來(lái)看一看吧,希望對(duì)你有幫助
    2021-11-11
  • 詳解mysql 獲取當(dāng)前日期及格式化

    詳解mysql 獲取當(dāng)前日期及格式化

    本篇文章主要介紹了mysql 獲取當(dāng)前日期及格式化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • 最新評(píng)論