MySQL 8.0 将数据库元信息都存放于InnoDB存储引擎表中,在以前版本的MySQL中,数据字典不只仅存放于特定的存储引擎表中,还存放于元数据文件、非事务性存储引擎表中。本文将会介绍MySQL 8.0对数据字典的改进,以及改进带来的好处、影响以及局限性。html
数据字典是数据库重要的组成部分之一,那么什么是数据字典?数据字典包含哪些内容呢?数据字典是对数据库中的数据、库对象、表对象等的元信息的集合。在MySQL中,数据字典信息内容就包括表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信息、存储过程、触发器等内容。MySQL INFORMATION_SCHEMA库提供了对数据局元数据、统计信息、以及有关MySQL server的访问信息(例如:数据库名或表名,字段的数据类型和访问权限等)。该库中保存的信息也能够称为MySQL的数据字典。 在MySQL8.0以前,MySQL的数据字典信息,并无所有存放在系统数据库表中,部分数据库数据字典信息存放于文件中,其他的数据字典信息存放于数据字典库中(INFORMATION_SCHEMA,mysql,sys)。例如表结构信息存放在.frm
文件中,数据库表字段信息存放于INFORMATION_SCHEMA下的COLUMNS表中。早期,5.6版本以前,MyISAM是MySQL的默认存储引擎,而做为MyISAM存储引擎,它是没有数据字典的。只有表结构信息记录在.frm
文件中。MySQL5.6版本以后,将InnoDB存储引擎做为默认的存储引擎。在InnoDB存储引擎中,添加了一些数据字典文件用于存放数据字典元信息,例如:.opt
文件,记录了每一个库的一些基本信息,包括库的字符集等信息,.TRN
,.TRG
文件用于存放触发器的信息内容。mysql
最新的MySQL 8.0 发布以后,对数据库数据字典方面作了较大的改进。git
.frm
,.opt
,.par
,.TRN
,.TRG
,.isl
文件都移除了,再也不经过文件的方式存储数据字典信息。8.0中对数据字典进行改进以后,很大程度上提升了对INFORMATIONS_SCHEMA的查询性能,经过能够经过查表快速的得到想要查询的数据,缘由是:github
MySQL8.0开始支持原子DDL操做,一个原子DDL操做,具体的操做内容包括:数据字典更新,存储引擎层的操做,在binlog中记录DDL操做。而且这些操做都是原子性的,表示中间过程出现错误的时候,是能够完整回退的。这在以前版本的DDL操做中是不支持的。以前数据库版本中一直没有支持原子DDL的特性,是有缘由的,由于在早期的数据库版本中,数据库元信息存放于元信息文件中、非事务性表中以及特定存储引擎的数据字典中。这些都没法保证DDL操做内容在一个事务当中,没法保证原子性。 具体的原子DDL,后续会有专门的文章。sql
在8.0以前版本中,innodb_read_only参数能够阻止对InnoDB存储引擎表的create和drop等更新操做。可是在MySQL8.0中,开启innodb_read_only参数阻止了全部存储引擎的这些操做。create或者drop表的操做都须要更新数据字典表,8.0中这个数据字典表都改成了InnoDB存储引擎,因此对于数据字典表的更新会失败,从而致使各存储引擎create和drop表失败。一样的像ANALYZE TABLE
和ALTER TABLE tbl_name ENGINE=engine_name
这种操做也会失败,由于这些操做都要去更新数据字典表。数据库
MySQL8.0以后,在使用mysqldump和mysqlpump导出数据时候,与以前有了一些不一样,主要是如下几点:缓存
MySQL8.0数据字典的改进有不少方便的特性,例如带来了原子DDL,提高了INFORMATION_SCHEMA的查询性能等,可是它并非完美的,新版数据字典仍是存在一些局限性:性能
目前已经正式GA的MySQL 8.0是使人很期待的一个版本,从数据字典方面的改进,到原子DDL,到数据库self tuning等等新特性,都让人为8.0感到激动。8.0中有许多新特性等待去尝试,去发现。优化
博客地址:win-man.github.io/
公众号:欢迎关注code