在使用命令行鏈接 MySQL 的時候,咱們在執行 SHOW DATABASES
命令時,會發現除了本身擁有權限的數據庫以外,還有另一個名爲 INFORMATION_SCHEMA 的表,這個表示用來作什麼用的呢?html
在 MySQL 中, INFORMATION_SCHEMA 是用來訪問數據庫的元數據(好比數據庫,表的名稱,列的數據類型或者訪問權限等)的,在每一個 MySQL 的實例中,INFORMATION_SCHEMA 保存了它維護的全部數據庫的信息,這個庫中包含了不少只讀的表(它們其實是一些視圖,所以並無與之關聯的文件,你能夠沒法爲他們建立觸發器),用於知足對 MySQL 服務自己的不一樣查詢需求。mysql
你能夠經過USE
語句選擇使用 INFORMATION_SCHEMA 做爲默認的數據庫,可是隻能對其執行讀取操做,沒法執行INSERT
,UPDATE
和DELETE
操做。
好比,下面的的 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 Queries。sql
在不一樣版本的 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。性能