information_schema系列四(跟踪,列约束,表和列)

Posted timxgb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了information_schema系列四(跟踪,列约束,表和列)相关的知识,希望对你有一定的参考价值。

 

 

 
这个系列的文章主要是为了能够让自己了解mysql5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益。
1:KEY_COLUMN_USAGE
按照官方的解释,这个表描述的是关于有约束的列。也就是没有约束的列都不会显示出来,按照整库查了一下,我里面有五张表,结果这个库记录的只有一条信息。因为只有这个列有约束,其他几张表都是测试玩的,并没有什么约束。
我现在创建两张表主键外键关联关系,然后查一下记录:
技术分享图片
 
看一下就很是明朗了有没有,test1的ID只是主键,后面的关联就会显示NULL,TEST2的外键就很能说明问题了,关联的那个表的那个键,自己是外键,以及在那个schema等,记住有一点就是ORDINAL_POSITION这个指的不是创建表时候列的顺序,而是这个约束的排序。信息还是很全面的。很多时候我们就可以根据这个直接去查询表的关联关系,而不需要在看表结构等信息。这个还是很不错的。查看某个表的关联关系很简单,根据TABLE_NAME列进行筛选就可以了。
 
2:INNODB_SYS_COLUMNS 和INNODB_SYS_TABLES
INNODB_SYS_COLUMNS 这个系统表存放的是INNODB的元数据, 他是依赖于SYS_COLUMNS这个统计表而存在的。
这两张表可以做个联合查询,就一块说了把,查看的就是TEST1表的所有列。用着还算是可以的。
select A.*, B.NAME from INNODB_SYS_TABLES AS A,INNODB_SYS_COLUMNS AS B WHERE A.TABLE_ID=B.TABLE_ID AND A.NAME LIKE ‘%TEST1%‘;
技术分享图片
也可以按照下面的进行查询:
select A.name, B.* from INNODB_SYS_TABLES AS A,INNODB_SYS_COLUMNS AS B WHERE A.TABLE_ID=B.TABLE_ID AND A.NAME LIKE ‘%TEST1%‘;

 

 
技术分享图片
个人感觉还是通过第二种查询起来还是比较好的。因为看出来直接看到表的列以及长度还是很不错的不是吗。
指的看的一点是INNODB_SYS_COLUMNS 的MTYPE和PRTYPE这两个列
MTYPE的对应关系看一下:
1 = VARCHAR, 2 = CHAR, 3 = FIXBINARY, 4 = BINARY, 5 = BLOB, 6 = INT, 7 = SYS_CHILD, 8 = SYS, 9 = FLOAT, 10 = DOUBLE, 11 = DECIMAL, 12 = VARMYSQL, 13 = MYSQL, 14 = GEOMETRY.

 

PRTYPE这个列是一个二进制的编码,表示了INNODB的精确数据类型,字符集编码和能不能为NULL.
INNODB_SYS_TABLES 这张表依赖的是SYS_TABLES数据字典中拉取出来的。此表提供了有关表格的格式和存储特性,包括行格式,压缩页面大小位级别的信息(如适用)。下面看一下官网给的解释:
Column name Description
TABLE_ID 所有的表自增排序的一个序号,每个表都是唯一的
NAME 表名字
FLAG This value provides bit level information about table format and storage characteristics including row format, compressed page size (if applicable), and whether or not the DATA DIRECTORY clause was used with CREATE TABLE or ALTER TABLE.
N_COLS The number of columns in the table. The number reported includes three hidden columns that are created by InnoDB (DB_ROW_ID,DB_TRX_ID, and DB_ROLL_PTR). The number reported also includes generated virtual columns, if present.
SPACE An identifier for the tablespace where the table resides. 0 means the InnoDB system tablespace. Any other number represents either a file-per-table tablespace or a general tablespace. This identifier stays the same after a TRUNCATE TABLE statement. For file-per-table tablespaces, this identifier is unique for tables across all databases in the instance.
FILE_FORMAT The table‘s file format (Antelope or Barracuda).
ROW_FORMAT The table‘s row format (Compact, Redundant, Dynamic, or Compressed).
ZIP_PAGE_SIZE The zip page size. Only applies to tables that use the Compressed row format.
SPACE_TYPE The type of tablespace to which the table belongs. Possible values include System (for the InnoDB system tablespace), General (for InnoDBgeneral tablespaces created using CREATE TABLESPACE, and Single (for InnoDB file-per-table tablespaces). Tables assigned to the system tablespace using the CREATE TABLE or ALTER TABLE TABLESPACE=innodb_system clause have a General SPACE_TYPE. TheSPACE_TYPE column was added in MySQL 5.7.6 with the introduction of InnoDB general tablespaces. For more information, see CREATE TABLESPACE.
通过这两张表可以查看表的基本信息和表对应的列的信息。还是比较方便的。
 
3:OPTIMIZER_TRACE
这个表就比较6了,提供的是优化跟踪功能产生的信息。不过这个功能默认是不开启,我们要设置开启才能看得到,下面看一下怎么开启:
# Turn tracing on (it‘s off by default): SET optimizer_trace="enabled=on"; SELECT ...; # your query here SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; # possibly more queries...
# When done with tracing, disable it: SET optimizer_trace="enabled=off";

 

上面是官网给的例子我们不要太在意,我们看一下自己的例子:
SET GLOBAL optimizer_trace="enabled=on";
做两三次查询:
然后再去查询就会有记录了,但是千万记住,为什么默认是是关闭的呢。因为这个东西很小奥性能,你想一下,你每做一次查询,查询的所有信息都要被记录下来。这不是非常的消耗性能吗。对服务器来说是一种负担,所以说一般情况下不要开启这个功能。只有当我们需要查询性能问题的时候才能开一下。另外,贴一下查询结果,太长了,截取一段就好了。
 技术分享图片
以后我们会详细看一下跟踪这个功能,因为数据库的优化的话必须是要有充足的信息的,所以说我们一定要学号跟踪,我打算下周花一周时间把跟踪学习一下,然后给大家分享一下。明天在看几个比较简单的系统表。下周好好学习一下跟踪。
 

以上是关于information_schema系列四(跟踪,列约束,表和列)的主要内容,如果未能解决你的问题,请参考以下文章

ARFoundation系列讲解-55人脸跟踪四

information_schema系列八(事物,锁)

information_schema系列十

information_schema系列七

information_schema系列十二

information_schema系列七