information_schema數據庫是MySQL系統自帶的數據庫,它提供了數據庫元數據的訪問方式。感受information_schema就像是MySQL實例的一個百科全書,記錄了數據庫當中大部分咱們須要告終的信息,好比字符集,權限相關,數據庫實體對象信息,外檢約束,分區,壓縮表,表信息,索引信息,參數,優化,鎖和事物等等。經過information_schema咱們能夠窺透整個MySQL實例的運行狀況,能夠告終MySQL實例的基本信息,甚至優化調優,維護數據庫等,能夠說是真正的一部百科全書啊哈哈。
下面就是根據本身學習的一些小小經驗將這些表進行一個大致的分類,方便你們告終,要是有不足的地方請指出,我會盡快修改。
1:關於字符集和排序規則相關的系統表
CHARACTER_SETS :存儲數據庫相關字符集信息(memory存儲引擎)
COLLATIONS :字符集對應的排序規則
COLLATION_CHARACTER_SET_APPLICABILITY:就是一個字符集和連線校對的一個對應關係而已
下面咱們說一下character sets和collations的區別:
字符集(character sets)存儲字符串,是指人類語言中最小的表義符號。例如’A'、’B'等;
排序規則(collations)規則比較字符串,collations是指在同一字符集內字符之間的比較規則
每一個字符序惟一對應一種字符集,但一個字符集能夠對應多種字符序,其中有一個是默認字符序(Default Collation)
MySQL中的字符序名稱聽從命名慣例:以字符序對應的字符集名稱開頭;以_ci(表示大小寫不敏感)、_cs(表示大小寫敏感)或_bin(表示按編碼值比較)結尾。例如:在字符序「utf8_general_ci」下,字符「a」和「A」是等價的
看一下有關於字符集和校對相關的MySQL變量:
character_set_server:默認的內部操做字符集
character_set_client:客戶端來源數據使用的字符集
character_set_connection:鏈接層字符集
character_set_results:查詢結果字符集
character_set_database:當前選中數據庫的默認字符集
character_set_system:系統元數據(字段名等)字符集
再看一下MySQL中的字符集轉換過程:
(1). MySQL Server收到請求時將請求數據從character_set_client轉換爲character_set_connection;
(2). 進行內部操做前將請求數據從character_set_connection轉換爲內部操做字符集,其肯定方法以下:
使用每一個數據字段的CHARACTER SET設定值;
若上述值不存在,則使用對應數據表的DEFAULT CHARACTER SET設定值(MySQL擴展,非SQL標準);
若上述值不存在,則使用對應數據庫的DEFAULT CHARACTER SET設定值;
若上述值不存在,則使用character_set_server設定值。
(3). 將操做結果從內部操做字符集轉換爲character_set_results。
2:權限相關的一些表:
SCHEMA_PRIVILEGES:提供了數據庫的相關權限,這個表是內存表是從mysql.db中拉去出來的。
TABLE_PRIVILEGES:提供的是表權限相關信息,信息是從 mysql.tables_priv 表中加載的
COLUMN_PRIVILEGES :這個表能夠清楚就能看到表受權的用戶的對象,那張表那個庫以及授予的是什麼權限,若是受權的時候加上with grant option的話,咱們能夠看獲得PRIVILEGE_TYPE這個值必須是YES。
USER_PRIVILEGES:提供的是表權限相關信息,信息是從 mysql.user 表中加載的
經過表咱們能夠很清晰看獲得MySQL受權的層次,SCHEMA,TABLE,COLUMN級別,固然這些都是基於用戶來授予的。能夠看獲得MySQL的受權也是至關的細密的,能夠具體到列,這在某一些應用場景下仍是頗有用的,好比審計等。
3:存儲數據庫系統的實體對象的一些表:
COLUMNS:存儲表的字段信息,全部的存儲引擎
INNODB_SYS_COLUMNS :存放的是INNODB的元數據, 他是依賴於SYS_COLUMNS這個統計表而存在的。
ENGINES :引擎類型,是否支持這個引擎,描述,是否支持事物,是否支持分佈式事務,是否可以支持事物的回滾點
EVENTS :記錄MySQL中的事件,相似於定時做業
FILES :這張表提供了有關在MySQL的表空間中的數據存儲的文件的信息,文件存儲的位置,這個表的數據是從InnoDB in-memory中拉取出來的,因此說這張表自己也是一個內存表,每次重啓從新進行拉取。也就是咱們下面要說的INNODB_SYS_DATAFILES這張表。還要注意一點的是這張表包含有臨時表的信息,因此說和SYS_DATAFILES 這張表是不可以對等的,仍是要從INNODB_SYS_DATAFILES看。若是undo表空間也配置是InnoDB 的話,那麼也是會被記錄下來的。
PARAMETERS :參數表存儲了一些存儲過程和方法的參數,以及存儲過程的返回值信息。存儲和方法在ROUTINES裏面存儲。
PLUGINS :基本上是MySQL的插件信息,是不是活動狀態等信息。其實SHOW PLUGINS自己就是經過這張表來拉取道德數據
ROUTINES:關於存儲過程和方法function的一些信息,不過這個信息是不包括用戶自定義的,只是系統的一些信息。
SCHEMATA:這個表提供了實例下有多少個數據庫,並且還有數據庫默認的字符集
TRIGGERS :這個表記錄的就是觸發器的信息,包括全部的相關的信息。系統的和本身用戶建立的觸發器。
VIEWS :視圖的信息,也是系統的和用戶的基本視圖信息。
這些表存儲的都是一些數據庫的實體對象,方便咱們進行查詢和管理,對於一個DBA來講,這些表可以大大方便咱們的工做,更快更方便的告終和查詢數據庫的相關信息。
4:約束外鍵等相關的一些表:
REFERENTIAL_CONSTRAINTS:這個表提供的外鍵相關的信息,並且只提供外鍵相關信息
TABLE_CONSTRAINTS :這個表提供的是 相關的約束信息
INNODB_SYS_FOREIGN_COLS :這個表也是存儲的INNODB關於外鍵的元數據信息和SYS_FOREIGN_COLS 存儲的信息是一致的
INNODB_SYS_FOREIGN :存儲的INNODB關於外鍵的元數據信息和SYS_FOREIGN_COLS 存儲的信息是一致的,只不過是單獨對於INNODB來講的
KEY_COLUMN_USAGE:數據庫中全部有約束的列都會存下下來,也會記錄下約束的名字和類別
爲何要把外鍵和約束單列出來呢,由於感受這是一塊獨立的東西,雖然咱們的生產環境大部分都不會使用外鍵,由於這會下降性能,可是合理的利用約束仍是一個不錯的選擇,好比惟一約束。
5:關於管理的一些的一些表:
GLOBAL_STATUS ,GLOBAL_VARIABLES,SESSION_STATUS,SESSION_VARIABLES:這四張表分別記錄了系統的變量,狀態(全局和會話的信息),做爲DBA相信你們也都比較熟悉了,並且這幾張表也是在系統重啓的時候回從新加載的。也就是內存表。
PARTITIONS :MySQL分區表相關的信息,經過這張表咱們能夠查詢到分區的相關信息(數據庫中已分區的表,以及分區表的分區和每一個分區的數據信息),分區相關詳細信息參見
MySQL分區管理
PROCESSLIST:show processlist其實就是從這個表拉取數據,PROCESSLIST的數據是他的基礎。因爲是一個內存表,因此咱們至關於在內存中查詢同樣,這些操做都是很快的。
INNODB_CMP_PER_INDEX,INNODB_CMP_PER_INDEX_RESET:這兩個表存儲的是關於壓縮INNODB信息表的時候的相關信息,有關整個表和索引信息都有.咱們知道對於一個INNODB壓縮表來講,無論是數據仍是二級索引都是會被壓縮的,由於數據自己也能夠看做是一個彙集索引。關於壓縮表在
information_schema系列十一有些許簡單的介紹。
INNODB_CMPMEM ,INNODB_CMPMEM_RESET:這兩個表是存放關於MySQL INNODB的壓縮頁的buffer pool信息,可是要注意一點的就是,用這兩個表來收集全部信息的表的時候,是會對性能形成嚴重的影響的,因此說默認是關閉狀態的。若是要打開這個功能的話咱們要設置innodb_cmp_per_index_enabled參數爲ON狀態。
INNODB_BUFFER_POOL_STATS :表提供有關INNODB 的buffer pool相關信息,和show engine innodb status提供的信息是相同的。也是show engine innodb status的信息來源。
INNODB_BUFFER_PAGE_LRU,INNODB_BUFFER_PAGE :維護了INNODB LRU LIST的相關信息,詳細請見小編筆記
innodb buffer pool小解
INNODB_BUFFER_PAGE :這個表就比較屌了,存的是buffer裏面緩衝的頁數據。查詢這個表會對性能產生很嚴重的影響,千萬不要再咱們本身的生產庫上面執行這個語句,除非你能接受服務短暫的停頓,詳細請見小編筆記
innodb buffer pool小解
INNODB_SYS_DATAFILES :這張表就是記錄的表的文件存儲的位置和表空間的一個對應關係(INNODB)
INNODB_TEMP_TABLE_INFO :這個表惠記錄全部的INNODB的全部用戶使用到的信息,可是隻能記錄在內存中和沒有持久化的信息。
INNODB_METRICS :提供INNODB的各類的性能指數,是對INFORMATION_SCHEMA的補充,收集的是MySQL的系通通計信息。這些統計信息都是能夠手動配置打開仍是關閉的。有如下參數都是能夠控制的:innodb_monitor_enable, innodb_monitor_disable, innodb_monitor_reset, innodb_monitor_reset_all。
INNODB_SYS_VIRTUAL :表存儲的是INNODB表的虛擬列的信息,固然這個仍是比較簡單的,在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;後者會將Generated Column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了能夠經過已有數據計算而得的數據,須要更多的磁盤空間,與實際存儲一列數據相比並無優點,所以,MySQL 5.7中,不指定Generated Column的類型,默認是Virtual Column。
INNODB_CMP,INNODB_CMP_RESET:存儲的是關於壓縮INNODB信息表的時候的相關信息,詳細請見推薦筆記。
爲何把這些表列爲管理相關的表呢,由於我感受像鏈接,分區,壓縮表,innodb buffer pool等表,咱們經過這些表都能很清晰的看到本身數據庫的相關功能的狀態,特別是咱們經過一些變量更容易窺透MySQL的運行狀態,方便咱們進行管理。相關筆記有推薦
innodb buffer pool小解,
MySQL分區管理,
information_schema系列十一。都是小編本身的筆記。
6:關於表信息和索引信息的一些表
TABLES,TABLESPACES,INNODB_SYS_TABLES ,INNODB_SYS_TABLESPACES :
TABLES這張表毫無疑問了,就是記錄的數據庫中表的信息,其中包括系統數據庫和用戶建立的數據庫。show table status like 'test1'\G的來源就是這個表;
TABLESPACES 倒是標註的活躍表空間。 這個表是不提供關於innodb的表空間信息的,對於咱們來講並無太大做用,由於咱們生產庫是強制INNODB的;
INNODB_SYS_TABLES 這張表依賴的是SYS_TABLES數據字典中拉取出來的。此表提供了有關表格的格式和存儲特性,包括行格式,壓縮頁面大小位級別的信息(如適用)
提供的是關於INNODB的表空間信息,其實和SYS_TABLESPACES 中的INNODB信息是一致的。
STATISTICS:這個表提供的是關於表的索引信息,全部索引的相關信息。
INNODB_SYS_INDEXES:提供相關INNODB表的索引的相關信息,和SYS_INDEXES 這個表存儲的信息基本是同樣的,只不事後者提供的是全部存儲引擎的索引信息,後者只提供INNODB表的索引信息。
INNODB_SYS_TABLESTATS:
這個表就比較重要了,記錄的是MySQL的INNODB表信息以及MySQL優化器會預估SQL選擇合適的索引信息,其實就是MySQL數據庫的統計信息
這個表的記錄是記錄在內存當中的,是一個內存表,每次重啓後就會從新記錄,因此只能記錄從上次重啓後的數據庫統計信息。有了這個表,咱們對於索引的維護就更加方便了,咱們能夠查詢索引的使用次數,方便清理刪除不經常使用的索引,提升表的更新插入等效率,節省磁盤空間。
INNODB_SYS_FIELDS :這個表記錄的是INNODB的表索引字段信息,以及字段的排名
INNODB_FT_CONFIG :這張表存的是全文索引的信息
INNODB_FT_DEFAULT_STOPWORD:這個表存放的是stopword 的信息,是和全文索引匹配起來使用的,和innodb的 INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD 是相同的,這個STOPWORD必須是在建立索引以前建立,並且必須指定字段爲varchar。stopword 也就是咱們所說的中止詞,全文檢索時,中止詞列表將會被讀取和檢索,在不一樣的字符集和排序方式下,會形成命中失敗或者找不到此數據,這取決於中止詞的不一樣的排序方式。咱們可使用這個功能篩選沒必要要字段。
INNODB_FT_INDEX_TABLE:這個表存儲的是關於INNODB表有全文索引的索引使用信息的,一樣這個表也是要設置innodb_ft_aux_table之後纔可以使用的,通常狀況下是空的
INNODB_FT_INDEX_CACHE :這張表存放的是插入前的記錄信息,也是爲了不DML時候昂貴的索引重組
7:關於MySQL優化相關的一些表
OPTIMIZER_TRACE :提供的是優化跟蹤功能產生的信息.關於這個我也謝了作了一個小測試,
MySQL追蹤優化器小試
PROFILING:SHOW PROFILE能夠深刻的查看服務器執行語句的工做狀況。以及也能幫助你理解執行語句消耗時間的狀況。一些限制是它沒有實現的功能,不能查看和剖析其餘鏈接的語句,以及剖析時所引發的消耗。
SHOW PROFILES顯示最近發給服務器的多條語句,條數根據會話變量profiling_history_size定義,默認是15,最大值爲100。設爲0等價於關閉分析功能。詳細信息請見MySQL profile
INNODB_FT_BEING_DELETED,INNODB_FT_DELETED: INNODB_FT_BEING_DELETED 這張表是INNODB_FT_DELETED的一個快照,只在OPTIMIZE TABLE 的時候纔會使用。詳細信息詳見個人
OPTIMIZE TABLE 小解
8:關於MySQL事物和鎖的相關的一些表
INNODB_LOCKS:如今獲取的鎖,可是不含沒有獲取的鎖,並且只是針對INNODB的。
INNODB_LOCK_WAITS:系統鎖等待相關信息,包含了阻塞的一行或者多行的記錄,並且還有鎖請求和被阻塞改請求的鎖信息等。
INNODB_TRX:包含了全部正在執行的的事物相關信息(INNODB),並且包含了事物是否被阻塞或者請求鎖。
咱們經過這些表就可以很方便的查詢出來未結束的事物和被阻塞的進程,這是否是更方便了,詳細可見
information_schema系列八(事物,鎖)
更多詳情見:information_schema系列:http://www.cnblogs.com/shengdimaya/tag/information_schema%E7%B3%BB%E5%88%97/