MySQL元数据库——information_schema
轉自: https://www.cnblogs.com/postnull/p/6697077.html
平時使用MySQL客戶端操作數據庫的同學,只要稍微留神都會發現,除了我們建的庫之外,還經常看到三個數據庫的影子:
1. information_schema 2. performance_schema 3. mysql這三個數據庫究竟是什么東西呢?今天我們好好認識一下MySQL三個火槍手中的information_schema。
?
一、數據庫實例和數據庫
在認識information_schema前,我們先了解下數據庫實例和數據庫的區別和聯系。我們本地啟動MySQL服務,就是啟動了一個數據庫實例,他首先是一個進程管理了一系列的數據庫文件。而我們執行create database cmcc_web?這條SQL語句時,才是真正創建一個數據庫,他是一堆表的集合,其實也是文件的集合。簡而言之,數據庫實例就是RDBMS(數據庫管理系統),數據庫就是Database,Database是存放數據的倉庫,RDBMS就是管理倉庫的系統。
在MySQL中,每個schema就是對應一個數據庫。這個詞將會在下面的篇幅頻繁出現。
?
二、數據庫元數據
元(meta),一般被我們翻譯成“關于……的……”。元數據(meta data)——“data about data” 關于數據的數據,一般是結構化數據(如存儲在數據庫里的數據,規定了字段的長度、類型等)。(這段話來源于知乎)。
所以metadata就是描述數據的數據,在MySQL中就是描述database的數據。有哪些數據庫、每個表有哪些表、表有多少字段、字段是什么類型等等,這樣的數據就是數據庫的元數據。
官方定義:
INFORMATION_SCHEMA provides access to database metadata, information about the MySQL server such as the name of a database or table, the data type of a column, or access privileges
綜上,我們可以稱information_schema是一個元數據庫。它就像物業公司的信息庫,對管理的每棟大廈有多少電梯、電梯型號、每個房間的長寬高等等了如指掌。
?
三、常見的表
1、SCHEMATA
提供數據庫信息,有哪些數據庫,字符集是GBK還是UTF-8等等。常用字段:
| SCHEMA_NAME | 數據庫名 | |
| DEFAULT_CHARACTER_SET_NAME | 字符集 | |
| DEFAULT_COLLATION_NAME | 排序規則 |
等同命令:SHOW DATABASES
2、TABLES
提供表的信息,數據庫有哪些表,是什么存儲引擎等等。常用字段:
| SCHEMA_NAME | 數據庫名 | |
| TABLE_NAME | 表名 | |
| TABLE_TYPE | 表的類型 | 類型有BASE TABLE、VIEW、SYSTEM VIEW |
| ENGINE | 存儲引擎 | |
| CREATE_TIME | 建表時間 |
等同命令:SHOW TABLES
3、COLUMNS
提供字段的信息,有哪些字段字段類型是什么等等。常用字段:
| SCHEMA_NAME | 數據庫名 | |
| TABLE_NAME | 表名 | |
| COLUMN_NAME | 字段名 | |
| COLUMN_TYPE | 字段類型 | 如int(10),varchar(250) |
等同命令:SHOW COLUMNS?或者?desc tctest.emp?看emp表的具體字段。
4、STATISTICS
這張表的單詞是統計的意思,但是卻是索引的信息,真奇怪。常用字段:
| SCHEMA_NAME | 數據庫名 | |
| TABLE_NAME | 表名 | |
| INDEX_SCHEMA | 也是數據庫名 | |
| INDEX_NAME | 索引名 | |
| COLUMN_NAME | 字段名 | |
| INDEX_TYPE | 索引類型 | 一般是BTREE |
等同命令:SHOW INDEX
5、TABLE_CONSTRAINTS
提供約束情況,我們想看看表有哪些約束?約束指的是唯一性約束、主鍵約束、外鍵約束。常用字段:
| CONSTRAINT_SCHEMA | 數據庫名 | |
| CONSTRAINT_NAME | 約束名 | |
| TABLE_SCHEMA | 也是數據庫名 | |
| TABLE_NAME | 表名 | |
| CONSTRAINT_TYPE | 約束類型 | UNIQUE、PRIMARY KEY、FOREIGN KEY |
唯一約束和主鍵約束,我們在前面的索引中一樣可以查到。
6、KEY_COLUMN_USAGE
有STATISTICS和TABLE_CONSTRAINTS表,為什么還需要KEY_COLUMN_USAGE?
因為外鍵時沒有指出參考的是哪張表的哪個字段!常用字段:
| CONSTRAINT_SCHEMA | 數據庫名 | |
| CONSTRAINT_NAME | 約束名 | PRIMARY或列名或外鍵名 |
| TABLE_SCHEMA | 也是數據庫名 | |
| TABLE_NAME | 表名 | |
| COLUMN_NAME | 列名 | |
| REFERENCED_TABLE_SCHEMA | 參考的數據庫 | |
| REFERENCED_TABLE_NAME | 參考的表 | |
| REFERENCED_COLUMN_NAME | 參考的列 |
相比前面兩個,KEY_COLUMN_USAGE這個表的信息是最全的。包括主鍵、外鍵、唯一約束。
7、ROUTINES
routines是程序的意思,在MySQL當然指的是函數和存儲過程
| SPECIFIC_NAME | 程序名 | |
| ROUTINE_SCHEMA | 數據庫名 | |
| ROUTINE_NAME | 程序名 | |
| ROUTINE_TYPE | 程序類型 | PROCEDURE或FUNCTION |
| ROUTINE_BODY | 函數體 | 好像都是SQL |
| ROUTINE_DEFINITION | 具體的程序語句 |
并沒有show ROUTINES語句。
8、VIEWS
查詢數據庫下所有的視圖
| TABLE_SCHEMA | 數據庫名 | |
| TABLE_NAME | 表名 | |
| VIEW_DEFINITION | 視圖定義語句 |
9、TRIGGERS
查詢所有的觸發器
| TRIGGER_SCHEMA | 數據庫名 | |
| TRIGGER_NAME | 觸發器名 | |
| EVENT_OBJECT_SCHEMA | 觸發的數據庫 | |
| EVENT_OBJECT_TABLE | 觸發的表 | |
| ACTION_STATEMENT | 觸發的語句 | |
| ACTION_TIMING | 觸發時機 | BEFORE或AFTER |
等同命令:show triggers from tctest
10、其他表
ENGINES:列舉了當前數據庫對InnoDB、MEMORY、MyISAM等各種存儲引擎的支持情況。等同show ENGINES
GLOBAL_VARIABLES:服務器變量設置,一些開關和設置。等同命令show global variables。除了global還有session。
PLUGINS:MySQL的插件列表。可以看到存儲引擎InnoDB甚至binlog都是插件!binlog是強制加載的,InnoDB是默認打開的。等同命令show PLUGINS
PROCESSLIST:查看正在運行的線程!比如我查這個表,就看到一個查詢的線程。等同命令show full processlist
?
四、是表還是視圖?
文檔說information_schema下的表不是基本表,而是視圖。但是在VIEWS中查不到,在TABLES中能查到這些表,表類型是SYSTEM VIEW。存儲引擎使用的是MEMORY或MyISAM。
使用show命令
可以看到創建的是臨時表,存儲引擎是MEMORY
CREATE TEMPORARY TABLE `TABLES`( )ENGINE=MEMORY五、show命令還是select語句
show命令更簡便,有時也能達到相同目的。但是輸出格式已固定,select表的結果更完善,符合SQL標準。
?
六、Oracle中有information_schema嗎?
沒有實踐過,但是平時使用Oracle時沒有見到過這個庫。官方的FAQ給出了結果:
F:What is the difference between the Oracle Data Dictionary and MySQL INFORMATION_SCHEMA?
A:Both Oracle and MySQL provide metadata in tables. However, Oracle and MySQL use different table names and column names. The MySQL implementation is more similar to those found in DB2 and SQL Server, which also support INFORMATION_SCHEMA as defined in the SQL standard.
大意是DB2和SQL Server都支持information_schema,Oracle有元數據表,但是列名和表名不一樣。
總結
以上是生活随笔為你收集整理的MySQL元数据库——information_schema的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么制作网站站内链接(怎么制作网站站内链
- 下一篇: linux虚拟机tomcat上部署web