12-查询元数据信息
在日常工作中,我们经常会遇到类似下面的应用场景:
删除数据库test1下所有前缀为tmp的表;
将数据库test1下所有存储引擎为myisam的表改为innodb。
对于这类需求,在MySQL 5.0之前只能通过 show tables、show create table或者 show table status 等命令来得到指定数据库下的表名和存储引擎,但这些命令显示内容有限且不适合进行字符串的批量编辑。如果表很多,则操作起来非常低效。
MySQL 5.0之后,提供了一个新的数据库 information_schema,用来记录MySQL中的元数据信息。元数据指的是数据的数据,比如表名、列名、列类型、索引名等表的各种属性名称。这个库比较特殊,它是一个虚拟数据库,物理上并不存在相关的目录和文件;库里 show tables显示的各种“表”也并不是实际存在的物理表,而全部是视图。对于上面的两个需求,可以简单地通过两个命令得到需要的SQL语句:
select concat('drop table test1.',table_name,';') from tables where table_schema='test1' and table_name like 'tmp%';
select concat('alter table test1.',table_name,' engine=innodb;') from tables where table_schema='test1' and engine='MyISAM';
下面列出一些比较常用的视图。
SCHEMATA:该表提供了当前mysql实例中所有数据库的信息,show databases的结果取之此表。
TABLES:该表提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个 schema、表类型、表引擎、创建时间等信息。show tables from schemaname的结果取之此表。
COLUMNS:该表提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息。show columns from schemaname.tablename的结果取之此表。
STATISTICS:该表提供了关于表索引的信息。show index from schemaname.tablename的结果取之此表。