《MYSQL教程MySQL全局共享內(nèi)存介紹》要點(diǎn):
本文介紹了MYSQL教程MySQL全局共享內(nèi)存介紹,希望對您有用。如果有疑問,可以聯(lián)系我們。
MYSQL入門前言
MYSQL入門全局共享內(nèi)存則主要是 MySQL Instance(mysqld進(jìn)程)以及底層存儲引擎用來暫存各種全局運(yùn)算及可共享的暫存信息,如存儲查詢緩存的 Query Cache,緩存連接線程的 Thread Cache,緩存表文件句柄信息的 Table Cache,緩存二進(jìn)制日志的 BinLog Buffer, 緩存 MyISAM 存儲引擎索引鍵的 Key Buffer以及存儲 InnoDB 數(shù)據(jù)和索引的 InnoDB Buffer Pool 等等.下面針對 MySQL 主要的共享內(nèi)存進(jìn)行一個簡單的闡發(fā).
MYSQL入門查詢緩存(Query Cache)
MYSQL入門查詢緩存是 MySQL 比擬獨(dú)特的一個緩存區(qū)域,用來緩存特定 Query 的結(jié)果集(Result Set)信息,且共享給所有客戶端.通過對 Query 語句進(jìn)行特定的 Hash 計(jì)算之后與結(jié)果集對應(yīng)存放在 Query Cache 中,以提高完全相同的 Query 語句的相應(yīng)速度.當(dāng)我們打開 MySQL 的 Query Cache 之后,MySQL 接收到每一個 SELECT 類型的 Query 之后都會首先通過固定的 Hash 算法得到該 Query 的 Hash 值,然后到 Query Cache 中查找是否有對應(yīng)的 Query Cache.如果有,則直接將 Cache 的結(jié)果集返回給客戶端.如果沒有,再進(jìn)行后續(xù)操作,得到對應(yīng)的結(jié)果集之后將該結(jié)果集緩存到 Query Cache 中,再返回給客戶端.當(dāng)任何一個表的數(shù)據(jù)發(fā)生任何變化之后,與該表相關(guān)的所有 Query Cache 全部會失效,所以 Query Cache 對變更比擬頻繁的表并不是非常適用,但對那些變更較少的表是非常合適的,可以極大程度的提高查詢效率,如那些靜態(tài)資源表,配置表等等.為了盡可能高效的利 用 Query Cache,MySQL 針對 Query Cache 設(shè)計(jì)了多個 query_cache_type 值和兩個 Query Hint:SQL_CACHE 和 SQL_NO_CACHE.當(dāng) query_cache_type 設(shè)置為0(或者 OFF)的時候不使用 Query Cache,當(dāng)設(shè)置為1(或者 ON)的時候,當(dāng)且僅當(dāng) Query 中使用了 SQL_NO_CACHE 的時候 MySQL 會忽略 Query Cache,當(dāng) query_cache_type 設(shè)置為2(或者DEMAND)的時候,當(dāng)且僅當(dāng)Query 中使用了 SQL_CACHE 提示之后,MySQL 才會針對該 Query 使用 Query Cache.可以通過 query_cache_size 來設(shè)置可以使用的最大內(nèi)存空間.
MYSQL入門連接線程緩存(Thread Cache)
MYSQL入門連接線程是 MySQL 為了提高創(chuàng)建連接線程的效率,將部分空閑的連接線程保持在一個緩存區(qū)以備新進(jìn)連接哀求的時候使用,這尤其對那些使用短連接的應(yīng)用程序來說可以極大的提高創(chuàng) 建連接的效率.當(dāng)我們通過 thread_cache_size 設(shè)置了連接線程緩存池可以緩存的連接線程的大小之后,可以通過(Connections - Threads_created) / Connections * 100% 計(jì)算出連接線程緩存的命中率.注意,這里設(shè)置的是可以緩存的連接線程的數(shù)目,而不是內(nèi)存空間的大小.
MYSQL入門表緩存(Table Cache)
MYSQL入門表緩存區(qū)主要用來緩存表文件的文件句柄信息,在 MySQL5.1.3之前的版本通過 table_cache 參數(shù)設(shè)置,但從MySQL5.1.3開始改為 table_open_cache 來設(shè)置其大小.當(dāng)我們的客戶端程序提交 Query 給 MySQL 的時候,MySQL 需要對 Query 所涉及到的每一個表都取得一個表文件句柄信息,如果沒有 Table Cache,那么 MySQL 就不得不頻繁的進(jìn)行打開關(guān)閉文件操作,無疑會對系統(tǒng)性能產(chǎn)生一定的影響,Table Cache 正是為了辦理這一問題而產(chǎn)生的.在有了 Table Cache 之后,MySQL 每次需要獲取某個表文件的句柄信息的時候,首先會到 Table Cache 中查找是否存在空閑狀態(tài)的表文件句柄.如果有,則取出直接使用,沒有的話就只能進(jìn)行打開文件操作獲得文件句柄信息.在使用完之后,MySQL 會將該文件句柄信息再放回 Table Cache 池中,以供其他線程使用.注意,這里設(shè)置的是可以緩存的表文件句柄信息的數(shù)目,而不是內(nèi)存空間的大小.
MYSQL入門表定義信息緩存(Table definition Cache)
MYSQL入門表定義信息緩存是從 MySQL5.1.3 版本才開始引入的一個新的緩存區(qū),用來存放表定義信息.當(dāng)我們的 MySQL 中使用了較多的表的時候,此緩存無疑會提高對表定義信息的拜訪效率.MySQL 提供了 table_definition_cache 參數(shù)給我們設(shè)置可以緩存的表的數(shù)量.在 MySQL5.1.25 之前的版本中,默認(rèn)值為128,從 MySQL5.1.25 版本開始,則將默認(rèn)值調(diào)整為 256 了,最大設(shè)置值為524288.注意,這里設(shè)置的是可以緩存的表定義信息的數(shù)目,而不是內(nèi)存空間的大小.
MYSQL入門二進(jìn)制日志緩沖區(qū)(Binlog Buffer)
MYSQL入門二進(jìn)制日志緩沖區(qū)主要用來緩存由于各種數(shù)據(jù)變革操做所產(chǎn)生的 Binary Log 信息.為了提高系統(tǒng)的性能,MySQL 并不是每次都是將二進(jìn)制日志直接寫入 Log File,而是先將信息寫入 Binlog Buffer 中,當(dāng)滿足某些特定的條件(如 sync_binlog參數(shù)設(shè)置)之后再一次寫入 Log File 中.我們可以通過 binlog_cache_size 來設(shè)置其可以使用的內(nèi)存大小,同時通過 max_binlog_cache_size 限制其最大大小(當(dāng)單個事務(wù)過大的時候 MySQL 會申請更多的內(nèi)存).當(dāng)所需內(nèi)存大于 max_binlog_cache_size 參數(shù)設(shè)置的時候,MySQL 會報(bào)錯:“Multi-statement transaction required more than ‘max_binlog_cache_size' bytes of storage”.
MYSQL入門MyISAM索引緩存(Key Buffer)
MYSQL入門MyISAM 索引緩存將 MyISAM 表的索引信息緩存在內(nèi)存中,以提高其拜訪性能.這個緩存可以說是影響 MyISAM 存儲引擎性能的最重要因素之一了,通過 key_buffere_size 設(shè)置可以使用的最大內(nèi)存空間.
MYSQL入門InnoDB 日志緩沖區(qū)(InnoDB Log Buffer)
MYSQL入門這是 InnoDB 存儲引擎的事務(wù)日志所使用的緩沖區(qū).類似于 Binlog Buffer,InnoDB 在寫事務(wù)日志的時候,為了提高性能,也是先將信息寫入 Innofb Log Buffer 中,當(dāng)滿足 innodb_flush_log_trx_commit 參數(shù)所設(shè)置的相應(yīng)條件(或者日志緩沖區(qū)寫滿)之后,才會將日志寫到文件(或者同步到磁盤)中.可以通過 innodb_log_buffer_size 參數(shù)設(shè)置其可以使用的最大內(nèi)存空間.
注:innodb_flush_log_trx_commit 參數(shù)對 InnoDB Log 的寫入性能有非常關(guān)鍵的影響.該參數(shù)可以設(shè)置為0,1,2,解釋如下:
* 0:log buffer中的數(shù)據(jù)將以每秒一次的頻率寫入到log file中,且同時會進(jìn)行文件系統(tǒng)到磁盤的同步操作,但是每個事務(wù)的commit并不會觸發(fā)任何log buffer 到log file的刷新或者文件系統(tǒng)到磁盤的刷新操作;
* 1:在每次事務(wù)提交的時候?qū)og buffer 中的數(shù)據(jù)都會寫入到log file,同時也會觸發(fā)文件系統(tǒng)到磁盤的同步;
* 2:事務(wù)提交會觸發(fā)log buffer 到log file的刷新,但并不會觸發(fā)磁盤文件系統(tǒng)到磁盤的同步.此外,每秒會有一次文件系統(tǒng)到磁盤同步操作.
MYSQL入門此 外,MySQL文檔中還提到,這幾種設(shè)置中的每秒同步一次的機(jī)制,可能并不會完全確保非常準(zhǔn)確的每秒就一定會發(fā)生同步,還取決于進(jìn)程調(diào)度的問題.實(shí)際 上,InnoDB 能否真正滿足此參數(shù)所設(shè)置值代表的意義正常 Recovery 還是受到了不同 OS 下文件系統(tǒng)以及磁盤自己的限制,可能有些時候在并沒有真正完成磁盤同步的情況下也會告訴 mysqld 已經(jīng)完成了磁盤同步.
MYSQL入門InnoDB 數(shù)據(jù)和索引緩存(InnoDB Buffer Pool)
MYSQL入門InnoDB Buffer Pool 對 InnoDB 存儲引擎的作用類似于 Key Buffer Cache 對 MyISAM 存儲引擎的影響,主要的不同在于 InnoDB Buffer Pool 不僅僅緩存索引數(shù)據(jù),還會緩存表的數(shù)據(jù),而且完全依照數(shù)據(jù)文件中的數(shù)據(jù)快結(jié)構(gòu)信息來緩存,這一點(diǎn)和 Oracle SGA 中的 database buffer cache 非常類似.所以,InnoDB Buffer Pool 對 InnoDB 存儲引擎的性能影響之大就可想而知了.可以通過 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 計(jì)算得到 InnoDB Buffer Pool 的命中率.
MYSQL入門InnoDB 字典信息緩存(InnoDB Additional Memory Pool)
MYSQL入門InnoDB 字典信息緩存主要用來存放 InnoDB 存儲引擎的字典信息以及一些 internal 的共享數(shù)據(jù)結(jié)構(gòu)信息.所以其大小也與系統(tǒng)中所使用的 InnoDB 存儲引擎表的數(shù)量有較大關(guān)系.不外,如果我們通過innodb_additional_mem_pool_size 參數(shù)所設(shè)置的內(nèi)存大小不夠,InnoDB 會自動申請更多的內(nèi)存,并在 MySQL 的 Error Log 中記錄警告信息.
MYSQL入門這里所列舉的各種共享內(nèi)存,是我個人認(rèn)為對 MySQL 性能有較大影響的集中主要的共享內(nèi)存.實(shí)際上,除了這些共享內(nèi)存之外,MySQL 還存在很多其他的共享內(nèi)存信息,如當(dāng)同時哀求連接過多的時候用來存放連接哀求信息的back_log隊(duì)列等.
MYSQL入門以上內(nèi)容可能存在闡發(fā)不妥之處,歡迎各位朋友拍磚,一起交流.
歡迎參與《MYSQL教程MySQL全局共享內(nèi)存介紹》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/11944.html