程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL全局同享內存引見

MySQL全局同享內存引見

編輯:MySQL綜合教程

MySQL全局同享內存引見。本站提示廣大學習愛好者:(MySQL全局同享內存引見)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL全局同享內存引見正文


媒介

全局同享內存則重要是 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隊列等。

以上內容能夠存在剖析不當的地方,迎接列位同伙拍磚,一路交換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved