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