本篇内容介绍了“怎么理解并掌握mysql中的information_schema”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
| 什么是information_schema
information_schema提供了对数据库元数据、统计信息、以及有关MySQL Server的信息访问(例如:数据库名或表名,字段的数据类型和访问权限等)。该库中保存的信息也可以称为MySQL的数据字典或系统目录。
针对information_schema下的表的查询操作可以替代一些show查询语句(例如:SHOW DATABASES,SHOW TABLES等),与使用show语句相比,通过查询information_schema下的表获取数据有以下优势:
它符合"Codd法则",所有的访问都是基于表的访问完成的。
可以使用SELECT语句的SQL语法,只需要学习你要查询的一些表名和列名的含义即可
基于SQL语句的查询,对来自information_schema中的查询结果可以做过滤、排序、联结操作,查询的结果集格式对应用程序来说更友好
这种技术实现与其他数据库系统中类似的实现更具互操作性。例如:Oracle数据库的用户熟悉查询Oracle数据字典中的表,那么在MySQL中查询数据字典的表也可以使用同样的方法来执行查询获取想要的数据
访问information_schema需要的权限
所有用户都有访问information_schema下的表权限(但只能看到这些表中用户具有访问权限的对象相对应的数据行),但只能访问Server层的部分数据字典表,Server层中的部分数据字典表以及InnoDB层的数据字典表需要额外授权才能访问,如果用户权限不足,当查询Server层数据字典表时将不会返回任何数据,或者某个列没有权限访问时,该列返回NULL值。当查询InnoDB数据字典表时将直接拒绝访问(要访问这些表需要有process权限,注意不是select权限)
从information_schema中查询相关数据需要的权限也适用于SHOW语句。无论使用哪种查询方式,都必须拥有某个对象的权限才能看到相关的数据。
PS:
在MySQL 5.6版本中总共有59张表,其中10张MyISAM引擎临时表(数据字典表),49张Memory引擎临时表(保存统计信息和一些临时信息)。在MySQL 5.7版本中,该schema下总共有61张表,其中10个InnoDB存储引擎临时表(数据字典表),51个Memory引擎临时表。在MySQL 8.0中该schema下数据字典表(包含部分原memory引擎临时表)都迁移到了mysql schema下,且在mysql schema下这些数据字典表被隐藏,无法直接访问,需要通过information_schema下的同名表进行访问(统计信息表保留在information_schema下且仍然为Memory引擎)
虽然直接通过查询information_schema中的表获取数据有众多优势,但是因为SHOW语法已经耳熟能详且被广泛使用,所以SHOW语句仍然是一个备选方法,且随着information_schema的实现,SHOW语句中的功能还有所增强(可以使用like或where子句进行过滤),例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 语法
Syntax:
SHOW [GLOBAL | SESSION] VARIABLES
[LIKE 'pattern' | WHERE expr]
# 示例1
root@localhost : information_schema 12:20:31> show variables like '%log_bin%';
+
| Variable_name | Value |
+
| log_bin | ON |
| log_bin_basename | /home/mysql/data/mysqldata1/binlog/mysql-bin |
| log_bin_index | /home/mysql/data/mysqldata1/binlog/mysql-bin.index |
| log_bin_trust_function_creators | ON |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+
6 rows in set (0.00 sec)
# 实例2
root@localhost : information_schema 12:21:41> show variables where Variable_name like 'log_bin%' and Value='ON';
+
| Variable_name | Value |
+
| log_bin | ON |
| log_bin_trust_function_creators | ON |
+
2 rows in set (0.00 sec)
# 注意,like与where子句可单独使用,但要同时使用where与like子句时,like子句必须在where之后
|
| information_schema 组成对象
information_schema下的所有表都是使用的Memory和InnoDB存储引擎,且都是临时表,不是持久表,在数据库重启之后这些数据会丢失,在MySQL 的4个系统库中,也是唯一一个在文件系统上没有对应库表的目录和文件的系统库。
下面我们按照这些表的各自用途的相似度,我们把information_schema下的表做了如下归类,本期我们先大致了解下information_schema系统库中都有哪些表,这些表大致都有什么用途。
1. Server层统计信息字典表
COLUMNS:
提供查询表中的列(字段)信息
该表为InnoDB 存储引擎的临时表
KEY_COLUMN_USAGE:
REFERENTIAL_CONSTRAINTS:
提供查询关于外键约束的一些信息
该表为Memory引擎临时表
STATISTICS:
TABLE_CONSTRAINTS:
提供查询表相关的约束信息
该表为Memory引擎临时表
FILES:
ENGINES:
TABLESPACES:
SCHEMATA:
2. Server层表级别对象字典表
VIEWS:
TRIGGERS:
TABLES:
提供查询数据库内的表相关的基本信息
该表为Memory引擎临时表
ROUTINES:
PARTITIONS:
提供查询关于分区表的信息
该表为InnoDB引擎临时表
EVENTS:
提供查询计划任务事件相关的信息
该表是InnoDB引擎临时表
PARAMETERS:
3. Server 层混杂信息字典表
GLOBAL_STATUS、GLOBAL_VARIABLES、SESSION_STATUS、SESSION_VARIABLES:
OPTIMIZER_TRACE:
PLUGINS:
PROCESSLIST:
提供查询一些关于线程运行过程中的状态信息
该表为InnoDB引擎临时表
PROFILING:
CHARACTER_SETS:
COLLATIONS:
COLLATION_CHARACTER_SET_APPLICABILITY:
COLUMN_PRIVILEGES:
SCHEMA_PRIVILEGES:
TABLE_PRIVILEGES:
USER_PRIVILEGES:
4. InnoDB 层系统字典表
INNODB_SYS_DATAFILES:
提供查询InnoDB file-per-table和常规表空间数据文件的路径信息,等同于InnoDB数据字典中SYS_DATAFILES表中的信息
该表中的信息包含InnoDB所有表空间类型的元数据,包括独立表空间、常规表空间、系统表空间、临时表空间和undo表空间(如果开启了独立表空间的话)
该表为memory引擎临时表,查询该表的用户需要有process权限。
INNODB_SYS_VIRTUAL:
INNODB_SYS_INDEXES:
INNODB_SYS_TABLES:
INNODB_SYS_FIELDS:
INNODB_SYS_TABLESPACES:
INNODB_SYS_FOREIGN_COLS:
INNODB_SYS_COLUMNS:
INNODB_SYS_FOREIGN:
INNODB_SYS_TABLESTATS:
5. InnoDB 层锁、事务、统计信息字典表
INNODB_LOCKS:
INNODB_TRX:
INNODB_BUFFER_PAGE_LRU:
INNODB_LOCK_WAITS:
INNODB_TEMP_TABLE_INFO:
INNODB_BUFFER_PAGE:
INNODB_METRICS:
INNODB_BUFFER_POOL_STATS:
6. InnoDB 层全文索引字典表
INNODB_FT_CONFIG:
INNODB_FT_BEING_DELETED:
该表仅在OPTIMIZE TABLE语句执行维护操作期间作为INNODB_FT_DELETED表的快照数据存放使用。运行OPTIMIZE TABLE语句时,会先清空INNODB_FT_BEING_DELETED表中的数据,保存INNODB_FT_DELETED表中的快照数据到INNODB_FT_BEING_DELETED表,并从INNODB_FT_DELETED表中删除DOC_ID。由于INNODB_FT_BEING_DELETED表中的内容通常生命周期较短,因此该表中的数据对于监控或者调试来说用处并不大。
表中默认不记录数据,需要设置系统配置参数innodb_ft_aux_table=string(string表示db_name.tb_name字符串),并创建好全文索引,设置好停用词等。
查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
INNODB_FT_DELETED:
提供查询从InnoDB表的FULLTEXT索引中删除的行信息。它的存在是为了避免在InnoDB FULLTEXT索引的DML操作期间进行昂贵的索引重组操作,新删除的全文索引中单词的信息将单独存储在该表中,在执行文本搜索时从中过滤出搜索结果,该表中的信息仅在执行OPTIMIZE TABLE语句时清空。
该表中的信息默认不记录,需要使用innodb_ft_aux_table选项(该选项默认值为空串)指定需要记录哪个innodb引擎表的信息,例如:test/test。
查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
INNODB_FT_DEFAULT_STOPWORD:
该表为默认的全文索引停用词表,提供查询停用词列表值。启用停用词表需要开启参数innodb_ft_enable_stopword=ON,该参数默认为ON,启用停用词功能之后,如果innodb_ft_user_stopword_table选项(针对指定的innodb引擎表中的全文索引生效)自定义了停用词库表名称值,则停用词功能使用innodb_ft_user_stopword_table选项指定的停用词表,如果innodb_ft_user_stopword_table选项未指定,而innodb_ft_server_stopword_table选项(针对所有的innodb引擎表中的全文索引生效)自定义了停用词库表名称值,则同停用词功能使用innodb_ft_server_stopword_table选项指定的停用词表,如果innodb_ft_server_stopword_table选项也未指定,则使用默认的停用词表,即INNODB_FT_DEFAULT_STOPWORD表。
查询该表需要账户有PROCESS权限,该表为Memory引擎临时表
INNODB_FT_INDEX_TABLE:
INNODB_FT_INDEX_CACHE:
提供查询包含FULLTEXT索引的innodb存储引擎表中新插入行的全文索引标记信息。它存在的目的是为了避免在DML操作期间进行昂贵的索引重组,新插入的全文索引的单词的信息被单独存储在该表中,直到对表执行OPTIMIZE TABLE语句时、或者关闭服务器时、或者当高速缓存中存放的信息大小超过了innodb_ft_cache_size或innodb_ft_total_cache_size系统配置参数指定的大小才会执行清理。默认不记录数据,需要使用innodb_ft_aux_table系统配置参数指定需要记录哪个表中的新插入行的全文索引数据。
查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
7. InnoDB 层压缩相关字典表
INNODB_CMP和INNODB_CMP_RESET:
INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET:
这两个表中记录着InnoDB压缩表数据和索引相关的操作状态信息,对数据库、表、索引的每个组合使用不同的统计信息,以便为评估特定表的压缩性能和实用性提供参考数据。
对于InnoDB压缩表,会对表中的数据和所有二级索引都进行压缩。此时表中的数据被视为另一个索引(包含所有数据列的聚集索引)。
注意:由于为每个索引收集单独的度量值会导致性能大幅度降低,因此默认情况下不收集INNODB_CMP_PER_INDEX和INNODB_CMP_PER_INDEX_RESET表统计信息。如果确有需要,启用系统配置参数innodb_cmp_per_index_enabled即可(该配置参数为动态变量,默认为OFF)。
查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
INNODB_CMPMEM和INNODB_CMPMEM_RESET:
“怎么理解并掌握mysql中的information_schema”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注天达云网站,小编将为大家输出更多高质量的实用文章!