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

相關文章
相關標籤/搜索