MySQL 8.0 之数据字典

一、简介

MySQL 8.0 将数据库元信息都存放于InnoDB存储引擎表中,在以前版本的MySQL中,数据字典不只仅存放于特定的存储引擎表中,还存放于元数据文件、非事务性存储引擎表中。本文将会介绍MySQL 8.0对数据字典的改进,以及改进带来的好处、影响以及局限性。html

二、数据字典

2.一、新版本以前的数据字典

数据字典是数据库重要的组成部分之一,那么什么是数据字典?数据字典包含哪些内容呢?数据字典是对数据库中的数据、库对象、表对象等的元信息的集合。在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

2.二、新版本数据字典的改进

最新的MySQL 8.0 发布以后,对数据库数据字典方面作了较大的改进。git

  • 首先是,将全部原先存放于数据字典文件中的信息,所有存放到数据库系统表中,即将以前版本的.frm,.opt,.par,.TRN,.TRG,.isl文件都移除了,再也不经过文件的方式存储数据字典信息。
  • 其次是对INFORMATION_SCHEM,mysql,sys系统库中的存储引擎作了改进,原先使用MyISAM存储引擎的数据字典表都改成使用InnoDB存储引擎存放。从不支持事务的MyISAM存储引擎转变到支持事务的InnoDB存储引擎,为原子DDL的实现,提供了可能性。

三、新数据字典带来的影响

3.一、INFORMATION_SCHEMA性能提高

8.0中对数据字典进行改进以后,很大程度上提升了对INFORMATIONS_SCHEMA的查询性能,经过能够经过查表快速的得到想要查询的数据,缘由是:github

  • 数据库在查询INFORMATION_SCHEMA的表时,再也不必定须要建立一张临时表,能够直接查询数据字典表。
  • 在以前版本中,数据字典信息不必定是存放于表中,因此在获取数据字典信息时候,不只仅是查表操做。例如读取数据库表结构信息,底层实际上是读取.frm文件来得到,是一个文件打开读取的操做。而在新版本中,数据字典信息均可以经过直接查表的方式获取,替代那些获取信息慢的方式。
  • 对存储引擎的改进以后,在查询INFORMATIONS_SCHEMA表时,若是表上有索引,优化器会合理的利用索引。
  • 对于INFORMATION_SCHEMA下的STATISTICS表和TABLES表中的信息,8.0中经过缓存的方式,以提升查询的性能。能够经过设置information_schema_stats_expiry参数设置缓存数据的过时时间,默认是86400秒。查询这两张表的数据的时候,首先是到缓存中进行查询,缓存中没有缓存数据,或者缓存数据过时了,查询会从存储引擎中获取最新的数据。若是须要获取最新的数据,能够经过设置information_schema_stats_expiry参数为0或者ANALYZE TABLE操做。

3.二、原子DDL

MySQL8.0开始支持原子DDL操做,一个原子DDL操做,具体的操做内容包括:数据字典更新,存储引擎层的操做,在binlog中记录DDL操做。而且这些操做都是原子性的,表示中间过程出现错误的时候,是能够完整回退的。这在以前版本的DDL操做中是不支持的。以前数据库版本中一直没有支持原子DDL的特性,是有缘由的,由于在早期的数据库版本中,数据库元信息存放于元信息文件中、非事务性表中以及特定存储引擎的数据字典中。这些都没法保证DDL操做内容在一个事务当中,没法保证原子性。 具体的原子DDL,后续会有专门的文章。sql

3.三、innodb_read_only对全部存储引擎生效

在8.0以前版本中,innodb_read_only参数能够阻止对InnoDB存储引擎表的create和drop等更新操做。可是在MySQL8.0中,开启innodb_read_only参数阻止了全部存储引擎的这些操做。create或者drop表的操做都须要更新数据字典表,8.0中这个数据字典表都改成了InnoDB存储引擎,因此对于数据字典表的更新会失败,从而致使各存储引擎create和drop表失败。一样的像ANALYZE TABLEALTER TABLE tbl_name ENGINE=engine_name这种操做也会失败,由于这些操做都要去更新数据字典表。数据库

3.四、mysqldump mysqlpump导出的内容影响

MySQL8.0以后,在使用mysqldump和mysqlpump导出数据时候,与以前有了一些不一样,主要是如下几点:缓存

  • 以前版本的mysqldump和mysqlpump能够导出mysql系统库中的全部表的内容,8.0以后,只能导出mysql系统库中的非data dictionary table。(data dictionary table内容能够参照:dev.mysql.com/doc/refman/…
  • 以前版本当使用--all-databases参数导出数据的时候,不加--routines和--events选项也能够导出触发器、存储过程等信息,由于这些信息都存放于proc和event表中,导出全部表便可导出这些信息。可是在8.0中,proc表和event表都再也不使用,而且定义触发器、存储过程的数据字典表不会被导出,因此在8.0中使用mysqldump、mysqlpump导出数据的时候,若是须要导出触发器、存储过程等内容,必定须要加上--routines和--events选项。
  • 以前版本中--routines选项导出的时候,备份帐户须要有proc表的SELECT权限,在8.0中须要对全部表的SELECT权限
  • 以前版本中,导出触发器、存储过程能够同时导出触发器、存储过程的建立和修改的时间戳,8.0中再也不支持。

3.五、新数据字典的局限性

MySQL8.0数据字典的改进有不少方便的特性,例如带来了原子DDL,提高了INFORMATION_SCHEMA的查询性能等,可是它并非完美的,新版数据字典仍是存在一些局限性:性能

  • 经过手动mkdir的方式在数据目录下建立库目录,这种方式是不会被数据库所识别到。
  • DDL操做会花费更长的时间,由于以前的DDL操做是直接对.frm文件进行更改操做,只要写一个文件,如今是须要更新数据字典表,表明着须要将数据写到存储引擎、read log、undo log中。

四、总结

目前已经正式GA的MySQL 8.0是使人很期待的一个版本,从数据字典方面的改进,到原子DDL,到数据库self tuning等等新特性,都让人为8.0感到激动。8.0中有许多新特性等待去尝试,去发现。优化

博客地址:win-man.github.io/
公众号:欢迎关注code

相关文章
相关标签/搜索