MySQL 8.0版本首次發(fā)布于2018年下旬,目前已經(jīng)更新至8.0.26小版本。許多人在首次聽到8.0時(shí),常會(huì)感到自己錯(cuò)過了不少內(nèi)容,畢竟目前最常用的版本仍是5.7。MySQL的版本差異較大,從下圖可以看出,6版本被定位為過渡版本,旨在引入“更加頻繁和及時(shí)的MySQL服務(wù)器版本”,而7版本則專門為集群版本預(yù)留。因此,8.0版本成為了MySQL常用應(yīng)用場景的下一個(gè)重要版本號(hào)。

MySQL8.0除了給人以版本跨度大的感覺外,確實(shí)也做出了很多功能特性的新增或優(yōu)化,下面藍(lán)隊(duì)云將選取部分新特性并通過介紹使大家能夠?qū)π掳姹镜腗ySQL有更好的了解。
一、My SQL數(shù)據(jù)字典
數(shù)據(jù)字典是數(shù)據(jù)庫重要的組成部分,是數(shù)據(jù)庫中各類元數(shù)據(jù)的集合,在MySQL8.0之前,數(shù)據(jù)庫的數(shù)據(jù)字典。
主要由以下幾部分組成:
frm 、.opt 、.par 、.TRN 、.TRG等與表、庫、分區(qū)、觸發(fā)器相關(guān)的操作系統(tǒng)文件;
information_schema中的非InnoDB系統(tǒng)表;
information_schema中的InnoDB系統(tǒng)表
這種數(shù)據(jù)字典被分布到多個(gè)地方的方式,并不利于元數(shù)據(jù)的統(tǒng)一管理,同時(shí)由于操作系統(tǒng)文件以及非InnoDB的系統(tǒng)表,均不支持事務(wù),也影響到了MySQL DDL的ACID。因此在MySQL在8.0版本直后對(duì)于數(shù)據(jù)字典,做出了比較大的改進(jìn),一方面是移除了.frm 、.opt 、.par 、.TRN 、.TRG等操作系統(tǒng)文件,另一方面是將數(shù)據(jù)字典統(tǒng)一改進(jìn)為InnoDB存儲(chǔ)引擎存儲(chǔ)。設(shè)計(jì)理念參照了Oracle數(shù)據(jù)庫的方式,將元數(shù)據(jù)信息存放在基表中,然后通過視圖的方式提供給用戶查詢。因此在8.0版本的information_schema中,我們可看到的數(shù)據(jù)字典信息如下:

新的數(shù)據(jù)字典為MySQL帶來兩個(gè)積極的變化,一就是這種直接查表并且可利用新增的數(shù)據(jù)字典緩存的訪問方式提升了INFORMATIONS_SCHEMA的查詢性能,二是對(duì)原子DDL的支持,即在DDL操作過程中出現(xiàn)錯(cuò)誤的時(shí)候,是可以完整回退的,這在之前版本的DDL操作中是不支持的。
二、原子DDL
在8.0以前的版本中,MySQL是不支持原子DDL的,也就意味著一個(gè)DROP TABLE tab1,tab2;的語句由可能由于服務(wù)器crash或其他異常錯(cuò)誤導(dǎo)致部分成功部分失敗。而隨8.0中數(shù)據(jù)字典的改進(jìn),數(shù)據(jù)字典的更新,存儲(chǔ)引擎操作,寫?進(jìn)制日志結(jié)合成了一個(gè)事務(wù),也就是實(shí)現(xiàn)了對(duì)原子DDL的支持。
其具體過程如下:
Prepare:創(chuàng)建需要的對(duì)象,并將ddl日志寫入到mysql.innodb_ddl_log;ddl日志記錄了如何前滾和回滾ddl操作。
Perform:執(zhí)行ddl操作。
Commit:更新數(shù)據(jù)字典并提交。
post-ddl:重播并從mysql.innodb_ddl_log表格中刪除DDL?志。為確保回滾可以安全執(zhí)??不引?不?致性,在此最后階段執(zhí)??件操作(如重命名或刪除數(shù)據(jù)文件)。這一階段還從 mysql.innodb_dynamic_metadata的數(shù)據(jù)字典表刪除的動(dòng)態(tài)元數(shù)據(jù)為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。
原子DDL對(duì)于MySQL與其說是新特性,但更像是修復(fù)了8.0以前版本中的缺陷,使用戶對(duì)DDL操作的過程更為放心。
三、索引優(yōu)化
隱藏索引、降序索引、函數(shù)索引再8.0版本中紛紛登場,熟悉Oracle的同學(xué)對(duì)這3中索引一定也不陌生,甚至在MySQL中的創(chuàng)建語法都是和Oracle相同的,此處就不再贅述。隱藏索引主要起到灰度的作用,可以利用其特性減少索引回收及發(fā)布可能帶來的風(fēng)險(xiǎn),在運(yùn)維過程中是種比較常用的手段。降序索引則針對(duì)具體的業(yè)務(wù)場景,配合特定的SQL使用可以大幅減少排序帶來的成本。而函數(shù)索引就更為靈活了,不過在Oracle不推薦使用函數(shù)索引,在MySQL中則更不推薦使用,函數(shù)索引作為臨時(shí)手段可以救火,但根本還是應(yīng)從設(shè)計(jì)層面出發(fā)。
四、賬戶與安全
在MySQL賬戶和安全性方面,8.0版本也做出了一定程度的優(yōu)化。
主要可分為以下幾個(gè)部分:
1. 創(chuàng)建及授權(quán)
在MySQL5.7的版本可以通過一條語句完成賬戶的創(chuàng)建授權(quán)操作
grant all privileges on *.* to '用戶名'@'主機(jī)' identified by '密碼';
在MySQL8.0則被拆成了兩步執(zhí)行
create user '用戶名'@'主機(jī)' identified by '密碼';
grant all privileges on *.* to '用戶名'@'主機(jī)';
2. 認(rèn)證插件更新
MySQL8.0版本的默認(rèn)認(rèn)證插件由mysql_native_password改為了caching_sha2_password,因此使用NAVICAT之類客戶端工具時(shí)需可能會(huì)遇到1251的認(rèn)證錯(cuò)誤。
3. 口令管理
新增了以下參數(shù)來控制口令修改策略
password_history:修改密碼不允許與最近幾次使用或的密碼重復(fù);
password_reuse_interval:修改密碼不允許與最近多少天的使用過的密碼重復(fù);
password_require_current:修改密碼是否需要提供當(dāng)前的登錄密碼;
4. 角色
可以使用create role命令創(chuàng)建角色并對(duì)角色再進(jìn)行多個(gè)權(quán)限的grant授予,最后再將角色賦予用戶,通過這種方式,對(duì)用戶權(quán)限的管理也變得更為清晰易操作。
賬戶安全這部分,給人的感受也是越來越接近Oracle數(shù)據(jù)庫,總的來說目的還是為了提升其安全性,但目前來看,認(rèn)證插件遇到的問題還是較多的,主要原因在于有些常用的測試或管理工具還未能及時(shí)支持caching_sha2_password這種認(rèn)證方式,因此很多環(huán)境再8.0仍然保持5.7的mysql_native_password認(rèn)證設(shè)置。
除以上介紹的內(nèi)容外,MySQL在8.0中也新增了很多JSON函數(shù),使得普通格式數(shù)據(jù)可以方便快捷的轉(zhuǎn)換為JSON數(shù)據(jù),同時(shí)也可對(duì)JSON格式數(shù)據(jù)進(jìn)行判斷、校驗(yàn)、合并提取等操作。SQL語法上也新增了with as的通用表達(dá)式。引擎方面對(duì)于Innodb引擎也有了較多的增強(qiáng),如自增列持久化、死鎖檢測,甚至可以通過memcached實(shí)現(xiàn)類似NOSQL的簡單get操作。運(yùn)維方面也增加了資源管理的功能,REDO及UNDO的使用也做出優(yōu)化。總之MySQL 8.0在使用上帶來的變化還是非常豐富多彩的,我們應(yīng)在大版本的迭代過程中,關(guān)注基礎(chǔ)軟件做出的積極調(diào)整,并合理的將其運(yùn)用到系統(tǒng)建設(shè)工作中。
想了解更多技術(shù)小分享歡迎上藍(lán)隊(duì)云官網(wǎng)查詢,更多免費(fèi)技術(shù)學(xué)習(xí)文檔,藍(lán)隊(duì)云期待與您一起探索。