MySQL進階:INFORMATION_SCHEMA 簡介

在使用命令行鏈接 MySQL 的時候,咱們在執行 SHOW DATABASES 命令時,會發現除了本身擁有權限的數據庫以外,還有另一個名爲 INFORMATION_SCHEMA 的表,這個表示用來作什麼用的呢?html

-w677

在 MySQL 中, INFORMATION_SCHEMA 是用來訪問數據庫的元數據(好比數據庫,表的名稱,列的數據類型或者訪問權限等)的,在每一個 MySQL 的實例中,INFORMATION_SCHEMA 保存了它維護的全部數據庫的信息,這個庫中包含了不少只讀的表(它們其實是一些視圖,所以並無與之關聯的文件,你能夠沒法爲他們建立觸發器),用於知足對 MySQL 服務自己的不一樣查詢需求。mysql

你能夠經過 USE 語句選擇使用 INFORMATION_SCHEMA 做爲默認的數據庫,可是隻能對其執行讀取操做,沒法執行 INSERTUPDATEDELETE 操做。

好比,下面的的 SQL 能夠查詢出數據庫 wizard 中全部的表以及數據類型,存儲引擎。git

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 權限才能查看。github

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

不一樣表的用途

在不一樣版本的 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 數據庫是什麼,都有哪些表以及它們的用途作了個簡要的概述,在瞭解這個數據庫的基礎以後,咱們在下篇文章中將會詳細介紹 事務,鎖相關表以及如何排查死鎖問題,敬請關注。ide

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

參考文檔

相關文章
相關標籤/搜索