MySQL進階:INFORMATION_SCHEMA 簡介

在使用命令行連接 MySQL 的時候,我們在執行 SHOW DATABASES 命令時,會發現除了自己擁有權限的數據庫之外,還有另外一個名爲 INFORMATION_SCHEMA 的表,這個表示用來做什麼用的呢?

-w677

在 MySQL 中, INFORMATION_SCHEMA 是用來訪問數據庫的元數據(比如數據庫,表的名稱,列的數據類型或者訪問權限等)的,在每個 MySQL 的實例中,INFORMATION_SCHEMA 保存了它維護的所有數據庫的信息,這個庫中包含了很多隻讀的表(它們實際上是一些視圖,因此並沒有與之關聯的文件,你可以無法爲他們創建觸發器),用於滿足對 MySQL 服務本身的不同查詢需求。

你可以通過 USE 語句選擇使用 INFORMATION_SCHEMA 作爲默認的數據庫,但是隻能對其執行讀取操作,無法執行 INSERTUPDATEDELETE 操作。

比如,下面的的 SQL 可以查詢出數據庫 wizard 中所有的表以及數據類型,存儲引擎。

mysql> SELECT table_name, table_type, engine
    -> FROM information_schema.tables
    -> WHERE table_schema = 'wizard'
    -> ORDER BY table_name;
+----------------------+------------+---------+
| table_name           | table_type | engine  |
+----------------------+------------+---------+
| migrations           | BASE TABLE | InnoDB  |
| notifications        | BASE TABLE | InnoDB  |
| wz_attachments       | BASE TABLE | InnoDB  |
| wz_categories        | BASE TABLE | InnoDB  |
| wz_comments          | BASE TABLE | InnoDB  |
| wz_groups            | BASE TABLE | InnoDB  |
| wz_operation_logs    | BASE TABLE | ARCHIVE |
| wz_pages             | BASE TABLE | InnoDB  |
| wz_page_histories    | BASE TABLE | InnoDB  |
| wz_page_share        | BASE TABLE | InnoDB  |
| wz_page_tag          | BASE TABLE | InnoDB  |
| wz_password_resets   | BASE TABLE | InnoDB  |
| wz_projects          | BASE TABLE | InnoDB  |
| wz_project_catalogs  | BASE TABLE | InnoDB  |
| wz_project_group_ref | BASE TABLE | InnoDB  |
| wz_project_stars     | BASE TABLE | InnoDB  |
| wz_tags              | BASE TABLE | InnoDB  |
| wz_templates         | BASE TABLE | InnoDB  |
| wz_users             | BASE TABLE | InnoDB  |
| wz_user_group_ref    | BASE TABLE | InnoDB  |
+----------------------+------------+---------+
20 rows in set (0.00 sec)

在 MySQL 中,每個用戶都有對 INFORMATION_SCHEMA 的訪問權限,但是隻能看到表中他們有權限的對象的信息,也有點些場景下用戶如果沒有權限,看到的是 NULL。對於 InnoDB 表來說,必須擁有 PROCESS 權限才能查看。

由於使用 INFORMATION_SCHEMA 查詢可能會從多個數據庫檢索信息,所以查詢可能會比較耗時,對性能產生一定的影響。在執行之前,可以使用 EXPLAIN 命令檢查一下查詢的效率,關於如何優化 INFORMATION_SCHEMA 查詢效率,參考 Optimizing INFORMATION_SCHEMA Queries

不同表的用途

在不同版本的 MySQL/MariaDB 中, INFORMATION_SCHEMA 中的表並不完全一樣,但是大部分都是一致的,下面是 MariaDB 10.3 中包含的表,我對它們一一做了註釋

表名 用途
ALL_PLUGINS 服務器所有插件的信息,無論是否已經安裝
PLUGINS 服務器安裝的插件信息
APPLICABLE_ROLES 當前用戶可以使用的角色信息
CHARACTER_SETS 可用的字符集信息
CHECK_CONSTRAINTS 表上定義的 CHECK 約束信息
COLLATIONS 字符集排序規則信息
COLLATION_CHARACTER_SET_APPLICABILITY 字符集和排序規則的對應關係
COLUMNS 表中的列信息
COLUMN_PRIVILEGES 列的權限信息,數據來源於 mysql.columns_priv 系統表
ENABLED_ROLES 當前會話的角色信息
ENGINES 存儲引擎的信息,可以用於檢查引擎是否支持
EVENTS 關於事件管理器的事件信息
FILES 表空間數據存儲文件的信息
GLOBAL_STATUS 所有的狀態變量值,對應命令 SHOW GLOBAL STATUS
GLOBAL_VARIABLES 所有的系統變量值,對應命令 SHOW GLOBAL VARIABLES
SESSION_STATUS 所有的會話的狀態變量值,對應命令 SHOW SESSION STATUS
SESSION_VARIABLES 所有的會話變量,對應命令 SHOW SESSION VARIABLES
KEY_CACHES 關於 Segmented Key Cache 的統計信息
KEY_COLUMN_USAGE 描述了索引列有哪些約束
PARAMETERS 存儲過程參數,返回值信息
PARTITIONS 表分區信息,沒一行對應了一個獨立的分區或者分區表的子分區
PROCESSLIST 提供了哪些線程正在運行的信息
PROFILING 提供了語句剖析信息,它的內容對應了 SHOW PROFILE 和 SHOW PROFILES 語句的信息
REFERENTIAL_CONSTRAINTS 外鍵信息
ROUTINES 存儲過程信息
SCHEMATA 數據庫的信息
SCHEMA_PRIVILEGES 數據庫權限信息,數據來源於 mysql.db 系統表
STATISTICS 表索引信息
SYSTEM_VARIABLES 所有系統變量當前的值和各種元數據
TABLES 表的信息
TABLESPACES MySQL 集羣的表空間信息
TABLE_CONSTRAINTS 描述了哪個表有約束
TABLE_PRIVILEGES 表權限信息,數據來源於 mysql.table_priv 系統表
TRIGGERS 關於觸發器的信息,必須有表的 TRIGGER 權限才能查看
USER_PRIVILEGES 全局權限信息,數據來源於 mysql.user 系統表
VIEWS 數據庫視圖信息
GEOMETRY_COLUMNS 表中存儲空間數據的列的信息
SPATIAL_REF_SYS 存儲了數據庫中使用的每個空間參考系統的信息
CLIENT_STATISTICS 客戶端連接的統計信息,作爲 用戶統計 特性的一部分,默認不開啓
USER_STATISTICS 用戶活動的統計信息,作爲 用戶統計 特性的一部分,默認不開啓
INDEX_STATISTICS 索引使用統計,用於定位未使用的索引以及生成刪除命令,作爲 用戶統計 特性的一部分,默認不開啓
TABLE_STATISTICS 表使用的統計信息,作爲 用戶統計 特性的一部分,默認不開啓

在所有的存儲引擎中,我們最常用的就是 InnoDB 存儲引擎了,下面是 InnoDB 相關的表

表名 用途
INNODB_SYS_DATAFILES 數據文件存儲路徑信息
INNODB_SYS_TABLESTATS 狀態信息,可以用於開發性能相關的擴展或者高級的性能監控
INNODB_SYS_FIELDS 索引的字段信息
INNODB_SYS_COLUMNS 字段信息
INNODB_SYS_FOREIGN_COLS 外鍵列的信息
INNODB_SYS_FOREIGN 外鍵信息
INNODB_SYS_TABLES 表信息
INNODB_SYS_TABLESPACES 表空間信息
INNODB_SYS_INDEXES 索引信息
INNODB_SYS_VIRTUAL 虛擬列的元信息
INNODB_SYS_SEMAPHORE_WAITS 當前的信號量等待信息
INNODB_TABLESPACES_SCRUBBING 關於 數據清理 的信息
INNODB_CMPMEM 緩衝池中壓縮頁的信息,可用於度量表壓縮效率
INNODB_CMPMEM_RESET INNODB_CMPEM,但是每次查詢這個表會清空 RELOCATION_TIME 字段的值
INNODB_CMP_PER_INDEX 包含了以獨立的索引分組的與壓縮操作相關的狀態信息
INNODB_CMP_PER_INDEX_RESET INNODB_CMP_PER_INDEX, 但是每次查詢之後都會清空數據
INNODB_CMP 包含了與壓縮操作相關的狀態信息
INNODB_CMP_RESET INNODB_CMP,但是每次查詢之後會清空數據
INNODB_LOCK_WAITS 阻塞的事務信息
INNODB_TABLESPACES_ENCRYPTION 加密的表空間信息
INNODB_BUFFER_PAGE_LRU 有關緩衝池中頁的信息,以及出於清除目的如何對頁進行排序
INNODB_BUFFER_PAGE 緩衝池中頁的信息
INNODB_BUFFER_POOL_STATS 緩衝池中頁的信息,與 SHOW ENGINE INNODB STATUS 語句返回的內容類似
INNODB_FT_INDEX_TABLE 全文索引信息
INNODB_FT_DELETED 包含了從全文索引中已經刪除的行,這些信息用於過濾查詢請求的結果,解決每次刪除一行時昂貴的重新組織索引操作
INNODB_FT_INDEX_CACHE 最近插入到全文索引的行信息,爲了避免每次改變都去重新組織索引,新的變更只在 OPTIMIZE TABLE 命令運行之後纔會合併到全文索引
INNODB_FT_BEING_DELETED OPTIMIZE TABLE 正在執行中,此時發生了與 INNODB_FT_DELETED 有關的文檔
INNODB_FT_DEFAULT_STOPWORD 包含了用於創建全文索引的停止詞列表
INNODB_FT_CONFIG 全文索引的元數據
INNODB_TRX 所有當前正在執行的事務的信息
INNODB_LOCKS 包含了事務請求但是未獲得的鎖或者阻塞其它事務的鎖的信息
INNODB_METRICS 一些有用的性能指標
INNODB_MUTEXES 監控互斥鎖和讀寫鎖

總結

本文只是對 INFORMATION_SCHEMA 數據庫是什麼,都有哪些表以及它們的用途做了個簡要的概述,在瞭解這個數據庫的基礎之後,我們在下篇文章中將會詳細介紹 事務,鎖相關表以及如何排查死鎖問題,敬請關注。

本文將會持續修正和更新,最新內容請參考我的 GITHUB 上的 程序猿成長計劃 項目,歡迎 Star,更多精彩內容請 follow me

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章