你可能永远不会用到但不能不知道的INFORMATION_SCHEMA

在这里插入图片描述

因为最近研究了代码自动生成框架,其中可以将数据库中所有的表自动生成JAVA、HTML、JS等文件,在熟悉的过程中发现在数据表操作上用到了INFORMATION_SCHEMA,这个在此之前并不是很熟悉。当我们安装好 MySQL 数据库后,会发现数据库实例自带有 information_schema 系统库,你是否有去关注过这个系统库呢?是否有查询过此库中的表数据呢?又是否清楚此库存在的具体作用呢?带着这些疑问,我们一起来看本篇文章。

一、概述

  INFORMATION_SCHEMA 是 MySQL 自带的信息数据库,其保存了MySQL服务器所有数据库的信息,例如数据库名、数据库的表、表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在 INFORMATION_SCHEMA 表里面。
  对于 INFORMATION_SCHEMA 中的大多数信息,每位MySQL用户均有权访问这些表,但仅限于表中与用户具有适当访问权限的对象相对应的行。虽然可以INFORMATION_SCHEMA通过语句选择默认数据库USE ,但只能读取表的内容,不能对它们执行 INSERTUPDATEDELETE操作。

二、表分类

  我们来具体看下 information_schema 下的表,根据MySQL版本的不同,表的个数和存放是有所不同的。在MySQL5.6 版本中总共有59个表,在MySQL5.7.23版本中,该schema下总共有61个表,而到了MySQL5.7.32该schema下总共有69个表,在MySQL 8.0版本中,该schema下的数据字典表都迁移到了mysql schema下,且在mysql schema下这些数据字典表被隐藏,无法直接访问,需要通过information_schema下的同名表进行访问。这里以 5.7.32 版本为例,说明information_schema需要了解的表。
  information_schema下的所有表使用的都是Memory存储引擎,且都是临时表,不是持久表,在数据库重启之后这些数据会丢失。在MySQL的4个系统库中,information_schema也是唯一一个在文件系统上没有对应库表的目录和文件的系统库。

2.1 统计信息类

2.1.1 schemata

该表提供了当前mysql实例中所有数据库的信息,一个schema就代表一个数据库。show databases 的结果取之此表。该表对应的列说明如下:

列名类型是否为空说明
catalog_namevarchar(512)NO
schema_namevarchar(64)NO数据库名
default_character_set_namevarchar(32)NO数据库默认编码
default_collation_namevarchar(32)NO
sql_pathvarchar(512)YES

2.1.2 tables

  tables表提供了关于数据库中的表的基本信息,详细表述了某个表属于哪个schema、表类型、表引擎、创建时间等信息,show tables from schemaname 的结果取之此表。该表对应的列说明如下:

列名类型是否为空说明
table_catalogvarchar(512)no
table_schemavarchar(64)no数据表所属的数据库名
table_namevarchar(64)no表名称
table_typevarchar(64)no表类型[system view、base table]
enginevarchar(64)yes使用的数据库引擎[MyISAM、CSV、InnoDB]
versionbigint(21)yes版本,默认值10
row_formatvarchar(10)yes行格式[Compact、Dynamic、Fixed]
table_rowsbigint(21)yes表里所存多少行数据
avg_row_lengthbigint(21)yes平均行长度
data_lengthbigint(21)yes数据长度
max_data_lengthbigint(21)yes最大数据长度
index_lengthbigint(21)yes索引长度
data_freebigint(21)yes空间碎片
auto_incrementbigint(21)yes做自增主键的自动增量当前值
create_timedatetimeyes表的创建时间
update_timedatetimeyes表的更新时间
check_timedatetimeyes表的检查时间
table_collationvarchar(32)yes表的字符校验编码集
checksumbigint(21)yes校验和
create_optionsvarchar(255)yes创建选项
table_commentvarchar(2048)no表的注释、备注

2.1.3 columns

  columns表提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,show tables from schemaname.tablename 的结果取之此表。该表对应的列说明如下:

列名类型是否为空说明
table_catalogvarchar(512)no包含该列的表所属的目录的名称,该值始终为def
table_schemavarchar(64)no数据库名
table_namevarchar(64)no表名
column_namevarchar(64)no列名
ordinal_positionbigint(21)no表中字段的位置
column_defaultlongtextyes字段的默认值
is_nullablevarchar(3)no是否可以取空值
data_typevarchar(64)no字段数据类型
character_maximum_lengthbigint(21)yes对于字符串列,最大长度(以字符为单位)
character_octet_lengthbigint(21)yes对于字符串列,最大长度(以字节为单位)
numeric_precisionbigint(21)yes对于数字字段,数字精度
numeric_scalebigint(21)yes对于数字字段,数字刻度
datetime_precisionbigint(21)yes对于时间字段,小数秒精度
character_set_namevarchar(32)yes对于字符串字段,字符集名称
collation_namevarchar(32)yes对于字符串字段,排序规则名称
column_typelongtextno字段数据类型
column_keyvarchar(3)no索引类型。主键:PRI、唯一索引:UNI、一般索引:MUL
extravarchar(30)no有关给定字段的任何其他可用信息
privilegesvarchar(80)no该列的权限
column_commentvarchar(1024)no字段定义中包含的任何注释
generation_expressionlongtextno对于生成的字段,显示用于计算列值的表达式

2.1.4 statistics

该表提供了关于表索引的信息,一个索引对应一行记录,show index from schemaname.tablename 的结果取之此表。该表对应的列说明如下:

列名类型是否为空说明
table_catalogvarchar(512)no所属的目录的名称。该值始终为def
table_schemavarchar(64)no表所属数据库的名称
table_namevarchar(64)no表的名称
non_uniquebigint(1)no不能包含重复项,则为 0,否则为 1
index_schemavarchar(64)no索引所属数据库的名称
index_namevarchar(64)no索引的名称
seq_in_indexbigint(2)no索引中的列序号,从 1 开始
column_namevarchar(64)no列名称
collationvarchar(1)yes排序方式。 A(升序)、D (降序)或NULL(未排序)
cardinalitybigint(21)yes
sub_partbigint(3)yes索引前缀
packedvarchar(10)yes
nullablevarchar(3)no是否可能包含 NULL值,是为YES,否则为""
index_typevarchar(16)no使用的索引方法 ( BTREE, FULLTEXT, HASH, RTREE)
commentvarchar(16)yes描述
index_commentvarchar(1024)no

2.2 表级别对象类

2.2.2 routines

该表提供了关于存储过程和存储函数的信息,但不包括用户自定义函数。该表对应的列说明如下:

列名类型是否为空说明
specific_namevarchar(64)no名称
routine_catalogvarchar(512)no所属的目录的名称。该值始终为def
routine_schemavarchar(64)no数据库的名称
routine_namevarchar(64)no
routine_typevarchar(9)noPROCEDURE:存储过程, FUNCTION:存储函数
data_typevarchar(64)no
character_maximum_lengthint(21)yes
character_octet_lengthint(21)yes
numeric_precisionbigint(21)yes
numeric_scaleint(21)yes
datetime_precisionbigint(21)yes
character_set_namevarchar(64)yes
collation_namevarchar(64)yes
dtd_identifierlongtextyes
routine_bodyvarchar(8)no
routine_definitionlongtextyes执行的 SQL 语句
external_namevarchar(64)yes
external_languagevarchar(64)yes
parameter_stylevarchar(8)no
is_deterministicvarchar(3)no
sql_data_accessvarchar(64)no
sql_pathvarchar(64)yes
security_typevarchar(7)no
createddatetimeno
last_altereddatetimeno
sql_modevarchar(8192)no
routine_commentlongtextno
definervarchar(93)no
character_set_clientvarchar(32)no
collation_connectionvarchar(32)no
database_collationvarchar(32)no

2.2.3 triggers

该表提供了关于某个数据库下的触发器相关信息。该表对应的列说明如下:

列名类型是否为空说明
trigger_catalogvarchar(512)no触发器所属目录,该值始终为def
trigger_schemavarchar(64)no触发器所属的数据库
trigger_namevarchar(64)no触发器的名称
event_manipulationvarchar(6)no触发事件
event_object_catalogvarchar(512)no
event_object_schemavarchar(64)no
event_object_tablevarchar(64)no
action_orderbigint(4)no
action_conditionlongtextyes
action_statementlongtextno
action_orientationvarchar(9)no
action_timingvarchar(6)no
action_reference_old_tablevarchar(64)yes
action_reference_new_tablevarchar(64)yes
action_reference_old_rowvarchar(3)no
action_reference_new_rowvarchar(3)no
createddatetime(2)yes触发器的创建时间
sql_modevarchar(8192)no
definervarchar(93)no
character_set_clientvarchar(32)no
collation_connectionvarchar(32)no
database_collationvarchar(32)no

2.2.4 views

该表给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。该表对应的列说明如下:

列名类型是否为空说明
table_schemavarchar(64)no所属的数据库的名称
table_namevarchar(64)no视图的名称
view_definitionlongtextno视图定义的语句
check_optionvarchar(8)no
is_updatablevarchar(3)no视图可更新标志
definervarchar(93)no创建视图的用户
security_typevarchar(7)no
character_set_clientvarchar(32)no
collation_connectionvarchar(32)no

2.2.5 events

该表提供查询与计划任务事件相关的信息。该表对应的列说明如下:

列名类型是否为空说明
event_catalogvarchar(64)no所属目录的名称。该值始终为def
event_schemavarchar(64)no所属数据库的名称
event_namevarchar(64)no事件的名称
definervarchar(93)no创建事件的用户
time_zonevarchar(64)no事件时区,默认值为SYSTEM
event_bodyvarchar(8)no用于事件语句的语言。该值始终为 SQL
event_definitionlongtextno事件执行的语句
event_typevarchar(9)no事件重复类型,ONE TIME:一次性、RECURRING:重复
execute_atdatetimeyes
interval_valuevarchar(256)yes事件重复执行之间的间隔数。对于一次性事件,该值始终为 NULL
interval_fieldvarchar(18)yes事件在重复之前等待间隔的时间单位。对于一次性事件,该值为 NULL
sql_modevarchar(8192)no
startsdatetimeyes重复事件的开始时间
endsdatetimeyes重复事件的结束时间
statusvarchar(18)no事件状态
on_completionvarchar(12)no
createddatetimeno创建时间
last_altereddatetimeno修改时间。如果事件未曾修改,则此值与该CREATED值相同。
last_executeddatetimeyes事件上次执行的时间。如果事件从未执行,则此列是NULL
event_commentvarchar(64)no创建事件的 MySQL 服务器 ID
originatorbigint(10)no
character_set_clientvarchar(32)no
collation_connectionvarchar(32)no
database_collationvarchar(32)no

2.3 权限、约束类

2.3.1 user_privileges

user_privileges(用户权限)表给出了关于全程权限的信息。该表对应的列说明如下:

列名类型是否为空说明
granteevarchar(81)no授予权限的帐户的名称
table_catalogvarchar(512)no目录的名称。该值始终为 def
privilege_typevarchar(64)no权限类型
is_grantablevarchar(3)no是否授权

2.3.2 schema_privileges

schema_privileges表给出了关于数据库权限的信息。该表对应的列说明如下:

列名类型是否为空说明
granteevarchar(81)no
table_catalogvarchar(512)no
table_schemavarchar(64)no数据库名
privilege_typevarchar(64)no权限类型
is_grantablevarchar(3)no是否授权

2.3.3 table_privileges

该表给出了关于表权限的信息。该表对应的列说明如下:

列名类型是否为空说明
granteevarchar(81)no授予权限的帐户名称
table_catalogvarchar(512)no表所属目录的名称。该值始终为def
table_schemavarchar(64)no表所属的数据库的名称
table_namevarchar(64)no表的名称
privilege_typevarchar(64)no权限类型
is_grantablevarchar(3)no

2.1.5 table_constraints

该表描述了存在约束的表以及表的约束类型。该表对应的列说明如下:

列名类型是否为空说明
constraint_catalogvarchar(512)no约束所属的目录的名称。该值始终为def
constraint_schemavarchar(64)no约束所属的数据库
constraint_namevarchar(64)no
table_schemavarchar(64)no表所属的数据库
table_namevarchar(64)no表的名称
constraint_typevarchar(64)no约束的类型。该值是 UNIQUEPRIMARY KEYFOREIGN KEYCHECK

2.3.4 column_privileges

column_privileges(列权限)表给出了关于列权限的信息。该表对应的列说明如下:

列名类型是否为空说明
granteevarchar(81)no授予权限的帐户的名称
table_catalogvarchar(512)no该列的表所属的目录的名称。该值始终为def
table_schemavarchar(64)no该列的表所属数据库的名称
table_namevarchar(64)no表的名称
column_namevarchar(64)no列的名称
privilege_typevarchar(64)no授予的权限
is_grantablevarchar(3)no

2.1.3 key_column_usage

该表描述了具有约束的键列,包含主键、唯一索引、外键等约束信息。例如:所在的库表列名、引用的库表列名等。该表对应的列说明如下:

列名类型是否为空说明
constraint_catalogvarchar(512)no约束所属的目录的名称。该值始终为def
constraint_schemavarchar(64)no约束所属的数据库的名称
constraint_namevarchar(64)no约束的名称
table_catalogvarchar(512)no表所属目录的名称。该值始终为def
table_schemavarchar(64)no表所属的架构(数据库)的名称
table_namevarchar(64)no具有约束的表的名称
column_namevarchar(64)no具有约束的列的名称
ordinal_positionbigint(10)no列在约束中的位置,从 1 开始编号
position_in_unique_constraintbigint(10)yes
referenced_table_schemavarchar(64)yes约束引用的数据库的名称
referenced_table_namevarchar(64)yes约束引用的表的名称
referenced_column_namevarchar(64)yes约束引用的列的名称

2.3.5 character_sets

该character_sets表提供了mysql实例可用字符集的信息。该表对应的列说明如下:

列名类型是否为空说明
character_set_namevarchar(32)no字符集名称
default_collate_namevarchar(32)no字符集的默认排序规则
descriptionvarchar(60)no字符集的描述
maxlenbigint(3)no存储一个字符所需的最大字节数

2.3.6 collations

collations表提供了关于各字符的排序规则的信息。该表对应的列说明如下:

列名类型是否为空说明
collation_namevarchar(32)no排序规则名称
character_set_namevarchar(32)no关联的字符集的名称
idbigint(11)no排序规则 ID
is_defaultvarchar(3)no排序规则是否为其字符集的默认值
is_compiledvarchar(3)no字符集是否编译到服务器中
sortlenbigint(3)no

2.4 InnoDB 表

2.4.1 innodb_trx

  该表提供查询当前在InnoDB引擎中执行的每个事务(不包括只读事务)的信息,包括事务是否正在等待锁、事务什么时间点开始、以及事务正在执行的SQL语句文本信息等(如果有SQL的话)。该表对应的列说明如下:

列名类型是否为空说明
trx_idvarchar(18)no唯一事务ID号。只读和非锁定事务不记录
trx_statevarchar(13)no事务执行状态。有效值为:running、lock wait、rolling back、committing
trx_starteddatetimeno事务开始时间
trx_requested_lock_idvarchar(81)yes事务当前正在等待锁的标识
trx_wait_starteddatetimeyes事务开始等待的时间
trx_weightbigint(21)no事务的权重,默认是0
trx_mysql_thread_idbigint(21)no事务线程id
trx_queryvarchar(1024)yes事务正在执行的 sql 语句
trx_operation_statevarchar(64)yes事务当前操作状态
trx_tables_in_usebigint(21)no当前事务执行的 sql 中使用的表的个数
trx_tables_lockedbigint(21)no当前执行 sql 的行锁数量
trx_lock_structsbigint(21)no事务保留的锁数量
trx_lock_memory_bytesbigint(21)no事务锁住的内存大小,单位为 bytes。
trx_rows_lockedbigint(21)no事务锁住的记录数
trx_rows_modifiedbigint(21)no事务更改的行数
trx_concurrency_ticketsbigint(21)no事务并发票数
trx_isolation_levelvarchar(16)no当前事务的隔离级别
trx_unique_checksint(1)no是否唯一性检查
trx_foreign_key_checksint(1)no是否外键检查
trx_last_foreign_key_errorvarchar(256)yes最后的外键错误
trx_adaptive_hash_latchedint(1)no
trx_adaptive_hash_timeoutbigint(21)no
trx_is_read_onlyint(1)no是否是只读事务,1表示只读
trx_autocommit_non_lockingint(1)no

  这个表对于排查因为事务未提交引起的锁问题可以说是举足轻重。当我们有事务长时间未提交导致锁住数据库,其他程序拿不到锁的时候,因为对这张表进行排查。

2.4.2 innodb_locks

  该表提供查询innodb引擎事务中正在请求的且并未获得的且同时阻塞了其他事务的锁信息(即没有发生不同事务之间的锁等待的锁信息,在这里是查看不到的,例如,只有一个事务时,该事务所加的锁信息无法查看到)。该表对应的列说明如下:

列名类型是否为空说明
lock_idvarchar(81)no唯一锁ID号,随时可能会发生变化
lock_trx_idvarchar(18)no持有该锁的事务ID
lock_modevarchar(32)no锁模式(如何请求锁)
lock_typevarchar(32)no锁的类型。record 代表行级锁,table 代表表级锁
lock_tablevarchar(1024)no锁定记录相关的表名称
lock_indexvarchar(1024)yes当 lock_type=’record’ 时,表示索引的名称;否则为 null
lock_spacebigint(21) unsignedyes当 lock_type=’record’ 时,表示锁定行的表空间 id;否则为 null
lock_pagebigint(21) unsignedyes当 lock_type=’record’ 时,表示锁定行的页号;否则为 null
lock_recbigint(21) unsignedyes当 lock_type=’record’ 时,表示被锁定的记录号;否则为 null
lock_datavarchar(8192)yes当 lock_type=’record’ 时,表示锁定行的主键;否则为null
  • 锁的模式有如下:
    • 行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。
    • 表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。

2.4.3 innodb_lock_waits

锁等待的对应关系。该表对应的列说明如下:

列名类型是否为空说明
requesting_trx_idvarchar(18)NO正在请求锁的事务ID
requested_lock_idvarchar(81)NO正在请求的锁ID
blocking_trx_idvarchar(18)NO当前拥有锁的事务ID
blocking_lock_idvarchar(81)NO当前拥有锁的锁ID

2.5 进程类

2.5.1 processlist

  MySQL进程列表指示服务器中执行的线程集当前正在执行的操作,PROCESSLIST表是进程信息的一个来源,其记录正在运行的线程的各种信息。该表对应的列说明如下:

列名类型是否为空说明
idbigint(21)no
uservarchar(32)no执行语句的 MySQL 用户
hostvarchar(64)no执行语句的客户端的主机名
dbvarchar(64)yes线程的默认数据库
commandvarchar(16)no执行的命令类型
timeint(7)no线程处于当前状态的时间,以秒为单位
statevarchar(64)yes线程状态
infolongtextyes线程正在执行的语句,如果不执行任何语句,其值为NULL

三、基本使用

3.1 查询MySQL某个数据库下所有的表信息

SELECT
	TABLE_NAME,-- 表名称
	TABLE_TYPE,-- 表类型
	AUTO_INCREMENT,-- 自增主键值
	TABLE_SCHEMA,-- 数据库
	ENGINE,-- 存储引擎
	TABLE_ROWS,-- 数据行数
	CREATE_TIME,-- 创建时间
	update_time,-- 更新时间
	IFNULL( table_comment, table_name ) AS table_comment -- 表注释
FROM
	information_schema.TABLES
WHERE
	TABLE_SCHEMA = '数据库名称'
ORDER BY table_name

如果不想指定具体的数据库而是当前登录数据库可以通过下面方式解决:

SELECT
	TABLE_NAME,-- 表名称
	TABLE_TYPE,-- 表类型
	AUTO_INCREMENT,-- 自增主键值
	TABLE_SCHEMA,-- 数据库
	ENGINE,-- 存储引擎
	TABLE_ROWS,-- 数据行数
	CREATE_TIME,-- 创建时间
	update_time,-- 更新时间
	IFNULL( table_comment, table_name ) AS table_comment -- 表注释
FROM
	information_schema.TABLES
WHERE
	TABLE_SCHEMA =(SELECT DATABASE()) 
ORDER BY table_name;

3.2 查看整个实例占用空间

SELECT
	concat( round( sum( data_length / 1024 / 1024 ), 2 ), 'MB' ) AS data_length_MB,
	concat( round( sum( index_length / 1024 / 1024 ), 2 ), 'MB' ) AS index_length_MB 
FROM
	information_schema.TABLES;

3.3 查看各个库占用空间

SELECT
	TABLE_SCHEMA,
	concat( TRUNCATE ( sum( data_length )/ 1024 / 1024, 2 ), ' MB' ) AS data_size,
	concat( TRUNCATE ( sum( index_length )/ 1024 / 1024, 2 ), 'MB' ) AS index_size 
FROM
	information_schema.TABLES 
GROUP BY
	TABLE_SCHEMA 
ORDER BY
	data_length DESC;

3.4 查看某个表占用空间

SELECT
	concat( round( sum( data_length / 1024 / 1024 ), 2 ), 'MB' ) AS data_length_MB,
	concat( round( sum( index_length / 1024 / 1024 ), 2 ), 'MB' ) AS index_length_MB 
FROM
	information_schema.TABLES 
WHERE
	table_schema = (SELECT DATABASE())
	-- TABLE_SCHEMA = '数据库名称'
	AND table_name = '表名'

3.5 查询某个数据表字段列和属性信息

select
	column_name,-- 列名称
	column_type, -- 列类型
	ifnull(column_default,'') AS column_default, -- 字段默认值
	if(is_nullable = 'no','0','1') AS is_nullable, -- 是否空
	if(is_nullable = 'no' AND column_key != 'PRI','1','0') AS is_required, -- 是否必须
	if(column_key = 'pri','1','0') AS is_pk, -- 是否主键
	if(extra = 'auto_increment','1','0') AS is_increment, -- 是否自增
	data_type, -- 数据类型
	ifnull(column_comment,'') as '字段注释'
from
	information_schema.columns
where
	table_schema = (select database()) and table_name = 'sys_upms_user'
ORDER BY ordinal_position;

3.6 查询产生锁的具体sql

SELECT
	a.trx_id 事务 id,a.trx_mysql_thread_id 事务线程 id,a.trx_query 事务 SQL 
FROM
	INFORMATION_SCHEMA.INNODB_LOCKS b,INFORMATION_SCHEMA.innodb_trx a 
WHERE
	b.lock_trx_id = a.trx_id;

3.7 查看所有线程信息

SELECT * FROM information_schema.PROCESSLIST;

3.8 查看非睡眠线程信息

SELECT * FROM information_schema.PROCESSLIST WHERE command != 'sleep';
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独泪了无痕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值