MySQL 8.0 正式版 8.0.11 已發(fā)布棘劣,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,還帶來(lái)了大量的改進(jìn)和更快的性能楞遏!
注意:從 MySQL 5.7 升級(jí)到 MySQL 8.0 僅支持通過(guò)使用 in-place 方式進(jìn)行升級(jí)茬暇,并且不支持從 MySQL 8.0 降級(jí)到 MySQL 5.7(或從某個(gè) MySQL 8.0 版本降級(jí)到任意一個(gè)更早的 MySQL 8.0 版本)。唯一受支持的替代方案是在升級(jí)之前對(duì)數(shù)據(jù)進(jìn)行備份橱健。
下面簡(jiǎn)要介紹 MySQL 8 中值得關(guān)注的新特性和改進(jìn)。
1. 性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍沙廉。MySQL 8.0 在以下方面帶來(lái)了更好的性能:讀/寫(xiě)工作負(fù)載拘荡、IO 密集型工作負(fù)載、以及高競(jìng)爭(zhēng)("hot spot"熱點(diǎn)競(jìng)爭(zhēng)問(wèn)題)工作負(fù)載撬陵。
2. NoSQL:MySQL 從 5.7 版本開(kāi)始提供 NoSQL 存儲(chǔ)功能珊皿,目前在 8.0 版本中這部分功能也得到了更大的改進(jìn)。該項(xiàng)功能消除了對(duì)獨(dú)立的 NoSQL 文檔數(shù)據(jù)庫(kù)的需求巨税,而 MySQL 文檔存儲(chǔ)也為 schema-less 模式的 JSON 文檔提供了多文檔事務(wù)支持和完整的 ACID 合規(guī)性蟋定。
3. 窗口函數(shù)(Window Functions):從 MySQL 8.0 開(kāi)始,新增了一個(gè)叫窗口函數(shù)的概念草添,它可以用來(lái)實(shí)現(xiàn)若干新的查詢方式驶兜。窗口函數(shù)與 SUM()、COUNT() 這種集合函數(shù)類似,但它不會(huì)將多行查詢結(jié)果合并為一行抄淑,而是將結(jié)果放回多行當(dāng)中屠凶。即窗口函數(shù)不需要 GROUP BY。
4. 隱藏索引:在 MySQL 8.0 中肆资,索引可以被“隱藏”和“顯示”矗愧。當(dāng)對(duì)索引進(jìn)行隱藏時(shí),它不會(huì)被查詢優(yōu)化器所使用郑原。我們可以使用這個(gè)特性用于性能調(diào)試唉韭,例如我們先隱藏一個(gè)索引,然后觀察其對(duì)數(shù)據(jù)庫(kù)的影響犯犁。如果數(shù)據(jù)庫(kù)性能有所下降属愤,說(shuō)明這個(gè)索引是有用的,然后將其“恢復(fù)顯示”即可栖秕;如果數(shù)據(jù)庫(kù)性能看不出變化春塌,說(shuō)明這個(gè)索引是多余的,可以考慮刪掉簇捍。
5. 降序索引:MySQL 8.0 為索引提供按降序方式進(jìn)行排序的支持只壳,在這種索引中的值也會(huì)按降序的方式進(jìn)行排序。
6. 通用表表達(dá)式(Common Table Expressions CTE):在復(fù)雜的查詢中使用嵌入式表時(shí)暑塑,使用 CTE 使得查詢語(yǔ)句更清晰吼句。
7. UTF-8 編碼:從 MySQL 8 開(kāi)始,使用 utf8mb4 作為 MySQL 的默認(rèn)字符集事格。
8. JSON:MySQL 8 大幅改進(jìn)了對(duì) JSON 的支持惕艳,添加了基于路徑查詢參數(shù)從 JSON 字段中抽取數(shù)據(jù)的 JSON_EXTRACT() 函數(shù),以及用于將數(shù)據(jù)分別組合到 JSON 數(shù)組和對(duì)象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數(shù)驹愚。
9. 可靠性:InnoDB 現(xiàn)在支持表 DDL 的原子性远搪,也就是 InnoDB 表上的 DDL 也可以實(shí)現(xiàn)事務(wù)完整性,要么失敗回滾逢捺,要么成功提交谁鳍,不至于出現(xiàn) DDL 時(shí)部分成功的問(wèn)題,此外還支持 crash-safe 特性劫瞳,元數(shù)據(jù)存儲(chǔ)在單個(gè)事務(wù)數(shù)據(jù)字典中倘潜。
10. 高可用性(High Availability):InnoDB 集群為您的數(shù)據(jù)庫(kù)提供集成的原生 HA 解決方案。
11. 安全性:對(duì) OpenSSL 的改進(jìn)志于、新的默認(rèn)身份驗(yàn)證涮因、SQL 角色、密碼強(qiáng)度伺绽、授權(quán)养泡。
詳細(xì)介紹
MySQL 8.0是全球最受歡迎的開(kāi)源數(shù)據(jù)庫(kù)的一個(gè)非常令人興奮的新版本嗜湃,全面改進(jìn)。一些關(guān)鍵的增強(qiáng)包括:
SQL窗口函數(shù)瓤荔,公用表表達(dá)式净蚤,NOWAIT和SKIP LOCKED,降序索引输硝,分組今瀑,正則表達(dá)式,字符集点把,成本模型和直方圖橘荠。
JSON擴(kuò)展語(yǔ)法,新功能郎逃,改進(jìn)排序和部分更新哥童。使用JSON表函數(shù),您可以使用JSON數(shù)據(jù)的SQL機(jī)制褒翰。
GIS地理支持贮懈。空間參考系統(tǒng)(SRS)优训,以及SRS感知空間數(shù)據(jù)類型朵你,空間索引和空間功能。
可靠性 DDL語(yǔ)句已變得原子性和崩潰安全揣非,元數(shù)據(jù)存儲(chǔ)在單個(gè)事務(wù)數(shù)據(jù)字典中抡医。由InnoDB提供支持刻蟹!
可觀察性性能架構(gòu)扣汪,信息架構(gòu)跋核,配置變量和錯(cuò)誤記錄的顯著增強(qiáng)仲锄。
可管理性遠(yuǎn)程管理,撤消表空間管理和新的即時(shí)DDL材失。
安全 OpenSSL改進(jìn)蓝角,新的默認(rèn)身份驗(yàn)證径簿,SQL角色琐驴,分解超級(jí)特權(quán)俘种,密碼強(qiáng)度等等。
性能 InnoDB在讀/寫(xiě)工作負(fù)載棍矛,IO綁定工作負(fù)載和高爭(zhēng)用“熱點(diǎn)”工作負(fù)載方面明顯更好安疗。增加了資源組功能抛杨,通過(guò)將用戶線程映射到CPU够委,為用戶提供一個(gè)選項(xiàng),以針對(duì)特定硬件上的特定工作負(fù)載進(jìn)行優(yōu)化
上面描述了一些亮點(diǎn)怖现,我鼓勵(lì)你進(jìn)一步深入到完整的系列里程碑博客posts-的8.0.0茁帽,8.0.1玉罐,8.0.2,8.0.3和8.0.4 -和甚至進(jìn)一步向下個(gè)人工作日志及其規(guī)格和實(shí)施細(xì)節(jié)潘拨〉跏洌或者,您也許只想看看github.com/mysql上的源代碼铁追。
開(kāi)發(fā)者功能
MySQL開(kāi)發(fā)人員需要新功能季蚂,而MySQL 8.0在諸如SQL,JSON琅束,正則表達(dá)式和GIS等領(lǐng)域提供了許多新的和更多需求的功能扭屁。開(kāi)發(fā)人員也希望能夠存儲(chǔ)Emojis,因此UTF8MB4現(xiàn)在是8.0中的默認(rèn)字符集涩禀。最后料滥,數(shù)據(jù)類型得到了改進(jìn),在BINARY數(shù)據(jù)類型上進(jìn)行了按位操作艾船,并且改進(jìn)了IPv6和UUID功能葵腹。
SQL
窗口函數(shù)
MySQL 8.0提供了SQL窗口功能。與分組集合函數(shù)類似屿岂,窗口函數(shù)對(duì)一組行進(jìn)行一些計(jì)算践宴,例如COUNT或SUM。但是雁社,如果分組聚合將這組行集合到一行中浴井,則窗口函數(shù)將為結(jié)果集中的每一行執(zhí)行聚合。
窗口函數(shù)有兩種形式:用作窗口函數(shù)和專用窗口函數(shù)的SQL聚合函數(shù)霉撵。這是MySQL中支持窗口化的集合函數(shù)集合:COUNT磺浙,SUM,AVG徒坡,MIN撕氧,MAX,BIT_OR喇完,BIT_AND伦泥,BIT_XOR,STDDEV_POP(及其同義詞STD锦溪,STDDEV)不脯,STDDEV_SAMP,VAR_POP(及其同義詞VARIANCE)和VAR_SAMP刻诊。這組專門(mén)的窗口函數(shù)是:RANK防楷,DENSE_RANK,PERCENT_RANK则涯,CUME_DIST复局,NTILE冲簿,ROW_NUMBER,F(xiàn)IRST_VALUE亿昏,LAST_VALUE峦剔,NTH_VALUE,LEAD和LAG
對(duì)窗口函數(shù)(又名分析函數(shù))的支持是一種頻繁的用戶請(qǐng)求角钩。窗口函數(shù)一直是標(biāo)準(zhǔn)SQL(SQL 2003)的一部分吝沫。在這里可以看到Dag Wanvik的 博客文章以及Guilhem Bichot 在這里的博客文章。
公用表表達(dá)式
MySQL 8.0提供[遞歸]公用表表達(dá)式(CTE)递礼。非遞歸CTE可以解釋為“改進(jìn)的派生表”野舶,因?yàn)樗试S派生表被多次引用。遞歸CTE是一組迭代構(gòu)建的行:從最初的一組行開(kāi)始宰衙,一個(gè)進(jìn)程派生新的行平道,然后將這些新的行重新輸入到進(jìn)程中,產(chǎn)生更多的行供炼,等等一屋,直到該過(guò)程不再生成行。CTE是一個(gè)通常需要的SQL功能袋哼,請(qǐng)參閱功能請(qǐng)求16244和32174冀墨。見(jiàn)吉揚(yáng)Bichot博客文章在這里,這里涛贯,這里和這里诽嘉。
NOWAIT和SKIP LOCKED
MySQL的8.0提供了NOWAIT與SKIP LOCKED該SQL鎖定子句中的替代品。通常弟翘,當(dāng)某行由于某個(gè)UPDATE或某一行而被鎖定時(shí)SELECT ... FOR UPDATE虫腋,任何其他事務(wù)都必須等待才能訪問(wèn)該鎖定的行。在某些使用情況下稀余,如果行被鎖定或忽略鎖定行悦冀,則需要立即返回。使用鎖定子句NOWAIT永遠(yuǎn)不會(huì)等待獲取行鎖睛琳。相反盒蟆,查詢將失敗并顯示錯(cuò)誤。使用鎖定子句SKIP LOCKED永遠(yuǎn)不會(huì)等待獲取列出的表上的行鎖师骗。相反历等,鎖定的行將被跳過(guò)并且不會(huì)被讀取。NOWAIT和SKIP LOCKED是經(jīng)常請(qǐng)求的SQL功能辟癌。請(qǐng)參閱功能請(qǐng)求49763寒屯。我們也想對(duì)Kyle Oppenheim 說(shuō)聲謝謝為他的代碼貢獻(xiàn)!請(qǐng)參閱Martin Hansson 在這里發(fā)表的博文愿待。
降序索引
MySQL 8.0按降序提供對(duì)索引的支持浩螺。這種索引中的值按降序排列,我們將其向前掃描仍侥。在8.0之前要出,當(dāng)用戶創(chuàng)建降序索引時(shí),我們創(chuàng)建了一個(gè)升序索引并向后掃描农渊。一個(gè)好處是前向索引掃描比后向索引掃描更快患蹂。真正的降序索引的另一個(gè)好處是,它使我們能夠使用索引而不是文件夾作為ORDER BY具有混合ASC/DESC排序關(guān)鍵部分的子句砸紊。降序索引是一個(gè)頻繁請(qǐng)求的SQL功能传于。請(qǐng)參閱功能請(qǐng)求13375。見(jiàn)Chaithra Gopalareddy博客文章 在這里醉顽。
GROUPING
MySQL 8.0提供GROUPING()沼溜,SQL_FEATURE T433。該GROUPING()功能區(qū)分超常規(guī)行與常規(guī)分組行游添。GROUP BY諸如ROLLUP產(chǎn)生超集合行的擴(kuò)展系草,其中所有值的集合由空值表示。使用該GROUPING()函數(shù)唆涝,您可以區(qū)分表示超常聚合行中所有值的集合的null與NULL常規(guī)行中的值找都。GROUPING是一個(gè)頻繁請(qǐng)求的SQL功能。請(qǐng)參閱功能請(qǐng)求3156和46053廊酣。感謝Zoe Dong和Shane Adams在功能請(qǐng)求46053中的代碼貢獻(xiàn)能耻!見(jiàn)Chaithra Gopalareddy博客文章 在這里。
優(yōu)化器提示
在5.7中亡驰,我們?yōu)閮?yōu)化器提示引入了一種新的提示語(yǔ)法晓猛。使用新的語(yǔ)法,可以SELECT | INSERT | REPLACE | UPDATE | DELETE在SQL語(yǔ)句中的關(guān)鍵字之后直接指定提示凡辱,并將其用/*+ */風(fēng)格注釋括起來(lái)鞍帝。(見(jiàn)這里的Sergey Glukhov博客文章5.7 )。在MySQL 8.0中煞茫,我們通過(guò)充分利用這種新風(fēng)格來(lái)完成圖片:
MySQL 8.0增加了INDEX_MERGE和的提示NO_INDEX_MERGE帕涌。這允許用戶在不更改優(yōu)化器開(kāi)關(guān)的情況下控制單個(gè)查詢的索引合并行為。
MySQL的8.0增加了用于提示JOIN_FIXED_ORDER续徽,JOIN_ORDER蚓曼,JOIN_PREFIX,和JOIN_SUFFIX钦扭。這允許用戶控制聯(lián)合執(zhí)行的表順序纫版。
MySQL 8.0添加了一個(gè)叫做提示SET_VAR。該SET_VAR提示將針對(duì)只剩下一語(yǔ)句給定的系統(tǒng)變量設(shè)置的值客情。因此其弊,語(yǔ)句結(jié)束后癞己,該值將重置為先前的值。在這里可以看到Sergey Glukhov的博客文章梭伐。
我們更傾向于將新風(fēng)格的優(yōu)化器提示視為優(yōu)于舊式提示和optimizer_switch值設(shè)置痹雅。通過(guò)不與SQL混合,新的提示可以在查詢字符串中的許多地方注入糊识。他們?cè)谔崾荆╲s指令)方面也有更清晰的語(yǔ)義绩社。
JSON
MySQL 8.0增加了新的JSON函數(shù),并提高了排序和分組JSON值的性能赂苗。
JSON路徑表達(dá)式中的范圍的擴(kuò)展語(yǔ)法
MySQL 8.0擴(kuò)展了JSON路徑表達(dá)式中范圍的語(yǔ)法愉耙。例如SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');結(jié)果[2, 3, 4]。引入的新語(yǔ)法是SQL標(biāo)準(zhǔn)語(yǔ)法的一個(gè)子集拌滋,在SQL:2016朴沿,9.39 SQL / JSON路徑語(yǔ)言中描述:語(yǔ)法和語(yǔ)義。參見(jiàn)Roland Bouman所報(bào)告的Bug#79052败砂。
JSON表函數(shù)
MySQL 8.0增加了JSON表函數(shù)悯仙,可以使用JSON數(shù)據(jù)的SQL機(jī)制。JSON_TABLE()創(chuàng)建JSON數(shù)據(jù)的關(guān)系視圖吠卷。它將JSON數(shù)據(jù)評(píng)估的結(jié)果映射到關(guān)系行和列锡垄。用戶可以使用SQL查詢函數(shù)返回的結(jié)果為常規(guī)關(guān)系表,例如join祭隔,project和aggregate货岭。
JSON聚合函數(shù)
MySQL 8.0添加了聚合函數(shù)JSON_ARRAYAGG()來(lái)生成JSON數(shù)組并JSON_OBJECTAGG()生成JSON對(duì)象。這使得將多行中的JSON文檔組合成JSON數(shù)組或JSON對(duì)象成為可能疾渴。見(jiàn)克特林Besleaga博客文章在這里千贯。
JSON合并函數(shù)
該JSON_MERGE_PATCH()函數(shù)實(shí)現(xiàn)RFC7396指定的JavaScript(和其他腳本語(yǔ)言)的語(yǔ)義,即它通過(guò)第二個(gè)文檔的優(yōu)先級(jí)去除重復(fù)項(xiàng)搞坝。例如搔谴,。JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}
例如桩撮,該JSON_MERGE_PRESERVE()函數(shù)具有在MySQL 5.7中實(shí)現(xiàn)的JSON_MERGE()的語(yǔ)義敦第,該語(yǔ)法保留所有值 JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.
現(xiàn)有的JSON_MERGE()函數(shù)在MySQL 8.0中不推薦使用,以消除合并操作的歧義店量。請(qǐng)參閱Bug#81283中的提案以及Morgan Tocker 在此處的博文芜果。
JSON漂亮功能
MySQL 8.0 JSON_PRETTY()在MySQL中添加了一個(gè)函數(shù)。該函數(shù)接受JSON本機(jī)數(shù)據(jù)類型或JSON的字符串表示形式融师,并以新的行和縮進(jìn)方式以人類可讀的方式返回JSON格式的字符串右钾。
JSON大小函數(shù)
MySQL 8.0為給定的JSON對(duì)象添加了與空間使用相關(guān)的JSON函數(shù)。該JSON_STORAGE_SIZE()回報(bào)的JSON數(shù)據(jù)類型字節(jié)的實(shí)際大小。在JSON_STORAGE_FREE()返回以字節(jié)為單位舀射,包括分段和填充保存就地更新一個(gè)JSON二進(jìn)制類型的自由空間窘茁。
JSON改進(jìn)排序
MySQL 8.0通過(guò)使用可變長(zhǎng)度的排序鍵為排序/分組JSON提供了更好的性能。初步的基準(zhǔn)測(cè)試顯示脆烟,根據(jù)使用情況山林,分類的改進(jìn)度提高了1.2至18倍。
JSON部分更新
MySQL的8.0增加了對(duì)部分更新支持JSON_REMOVE()浩淘,JSON_SET()以及JSON_REPLACE()功能。如果只更新JSON文檔的某些部分吴攒,我們希望向處理程序提供有關(guān)更改內(nèi)容的信息张抄,以便存儲(chǔ)引擎和復(fù)制無(wú)需編寫(xiě)完整文檔。在復(fù)制環(huán)境中洼怔,無(wú)法保證JSON文檔的布局在從屬設(shè)備和主設(shè)備上完全相同署惯,因此物理差異無(wú)法用于減少基于行復(fù)制的網(wǎng)絡(luò)I / O。因此镣隶,MySQL 8.0提供了邏輯差異极谊,即基于行的復(fù)制可以通過(guò)線路發(fā)送并在從屬設(shè)備上重新應(yīng)用。見(jiàn)克努特安德斯·哈特蘭的博客文章在這里安岂。
GIS
MySQL 8.0提供地理支持轻猖。這包括對(duì)空間參考系統(tǒng)(SRS)的元數(shù)據(jù)支持,以及SRS感知空間數(shù)據(jù)類型域那,空間索引和空間函數(shù)咙边。簡(jiǎn)而言之,MySQL 8.0可以理解地球表面的緯度和經(jīng)度坐標(biāo)次员,例如败许,可以在大約5000個(gè)支持的空間參考系統(tǒng)中的任何一個(gè)中正確計(jì)算地球表面上兩點(diǎn)之間的距離。
空間參考系統(tǒng)(SRS)
的ST_SPATIAL_REFERENCE_SYSTEMS信息模式視圖提供有關(guān)空間數(shù)據(jù)可用的空間參考系統(tǒng)的信息淑蔚。該視圖基于SQL / MM(ISO / IEC 13249-3)標(biāo)準(zhǔn)市殷。每個(gè)空間參考系統(tǒng)都由一個(gè)SRID號(hào)碼標(biāo)識(shí)。MySQL 8.0附帶來(lái)自EPSG大地參數(shù)數(shù)據(jù)集的大約5000個(gè)SRID 刹衫,涵蓋地理參考橢球和2d投影(即所有2D空間參考系統(tǒng))醋寝。
SRID感知空間數(shù)據(jù)類型
空間數(shù)據(jù)類型可以用空間參考系統(tǒng)定義進(jìn)行歸屬,例如SRID 4326带迟,如下所示:CREATE TABLE t1 (g GEOMETRY SRID 4326);SRID在這里是GEOMETRY數(shù)據(jù)類型的SQL類型修飾符甥桂。插入具有SRID屬性的列中的值必須位于該SRID中。嘗試使用其他SRID插入值會(huì)導(dǎo)致引發(fā)異常情況邮旷。未修改的類型(即沒(méi)有SRID規(guī)范的類型)將繼續(xù)接受所有SRID黄选,如前所述。
MySQL 8.0添加了INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNSSQL / MM第3部分中指定的視圖。19.2办陷。這種觀點(diǎn)將列出所有幾何列在MySQL實(shí)例貌夕,并為每列將列出標(biāo)準(zhǔn)SRS_NAME,SRS_ID和GEOMETRY_TYPE_NAME民镜。
SRID感知空間索引
空間索引可以在空間數(shù)據(jù)類型上創(chuàng)建啡专。空間索引中的列必須聲明為NOT NULL制圈。例如像這樣:CREATE TABLE t1 (g GEOMETRY SRID 4326 NOT NULL, SPATIAL INDEX(g));
具有空間索引的列應(yīng)該具有SRID類型修飾符们童,以允許優(yōu)化器使用索引。如果在沒(méi)有SRID類型修飾符的列上創(chuàng)建空間索引鲸鹦,則會(huì)發(fā)出警告慧库。
SRID感知空間功能
MySQL的8.0延伸的空間的功能,例如 ST_Distance()和ST_Length()來(lái)檢測(cè)其參數(shù)是在一個(gè)地理(橢圓形)和SRS來(lái)計(jì)算對(duì)橢球的距離馋嗜。到目前為止齐板,ST_Distance和空間關(guān)系,例如ST_Within葛菇,ST_Intersects甘磨,ST_Contains,ST_Crosses眯停,等支持地理計(jì)算济舆。每個(gè)ST函數(shù)的行為如SQL / MM Part 3 Spatial中所定義。
字符集
MySQL 8.0使UTF8MB4成為默認(rèn)字符集莺债。SQL性能 - 比如對(duì)UTF8MB4字符串進(jìn)行排序 - 與5.7相比吗冤,8.0版本的性能提高了20倍。UTF8MB4是網(wǎng)絡(luò)中主要的字符編碼九府,這一舉措將使絕大多數(shù)MySQL用戶的生活更輕松椎瘟。
默認(rèn)字符集已從更改latin1為utf8mb4并且默認(rèn)排序規(guī)則從更改latin1_swedish_ci為utf8mb4_800_ci_ai。
默認(rèn)值的更改適用于libmysql和服務(wù)器命令工具以及服務(wù)器本身侄旬。
這些更改也反映在MTR測(cè)試中肺蔚,使用新的默認(rèn)字符集運(yùn)行。
整理重量和案例映射基于Unicode 9.0.0儡羔,由Unicode委員會(huì)于2016年6月21日發(fā)布宣羊。
已針對(duì)latin1(MySQL遺留版)使用了21種語(yǔ)言特定的不區(qū)分大小寫(xiě)排序規(guī)則 utf8mb4,例如捷克語(yǔ)排序規(guī)則變?yōu)閡tf8mb4_cs_800_ai_ci汰蜘。請(qǐng)參閱WL#9108中的完整列表仇冯。在這里可以看到Xing Zhang的博客文章。
增加了對(duì)區(qū)分大小寫(xiě)和區(qū)分變音的支持族操。MySQL 8.0支持由DUCET(默認(rèn)Unicode排序規(guī)則表)定義的所有3級(jí)歸類權(quán)重苛坚。在這里可以看到Xing Zhang的博客文章比被。
使用三個(gè)等級(jí)的重量排序字符的日語(yǔ)utf8mb4_ja_0900_as_cs整理utf8mb4。這給了日文正確的排序順序泼舱。在這里可以看到Xing Zhang的博客文章等缀。
日語(yǔ)有額外的假名敏感功能,utf8mb4_ja_0900_as_cs_ks其中'ks'代表'假名敏感'娇昙。在這里可以看到Xing Zhang的博客文章尺迂。
將所有新的排序規(guī)則從Unicode 9.0.0向前更改為NO PAD替代PAD STRING,即將字符串末尾的空格像其他任何字符一樣處理冒掌。這樣做是為了提高一致性和性能噪裕。較舊的排序規(guī)則留在原地。
看到的Bernt馬里烏斯·約翰森也是博客文章在這里股毫,這里和這里膳音。
數(shù)據(jù)類型
二進(jìn)制數(shù)據(jù)類型的按位操作
MySQL 8.0擴(kuò)展了按位操作('按位AND'等)以便使用[VAR]BINARY/[TINY|MEDIUM|LONG]BLOB。8.0之前的位操作僅支持整數(shù)皇拣。如果在二進(jìn)制文件上使用按位BIGINT操作严蓖,則在操作之前將參數(shù)隱式轉(zhuǎn)換為(64位)薄嫡,因此可能會(huì)丟失位氧急。從8.0開(kāi)始,逐位操作適用于所有數(shù)據(jù)類型BINARY和BLOB數(shù)據(jù)類型毫深,可以輸出參數(shù)以避免丟失位吩坝。
IPV6操縱
MySQL 8.0通過(guò)支持BINARY數(shù)據(jù)類型的按位操作來(lái)提高IPv6操作的可用性。在MySQL 5.6我們介紹了INET6_ATON()和INET6_NTOA()其將文本形式等之間的IPv6地址的功能'fe80::226:b9ff:fe77:eb17'和VARBINARY(16)哑蔫。但是钉寝,到目前為止,我們無(wú)法將這些IPv6功能與按位操作相結(jié)合闸迷,因?yàn)檫@些操作會(huì)錯(cuò)誤地將輸出轉(zhuǎn)換為BIGINT嵌纲。例如,如果我們有一個(gè)IPv6地址并且想要針對(duì)網(wǎng)絡(luò)掩碼進(jìn)行測(cè)試腥沽,我們現(xiàn)在可以使用逮走,因?yàn)樗梢? 正確返回?cái)?shù)據(jù)類型(128位)。見(jiàn)克特林Besleaga博客文章在這里今阳。INET6_ATON(address)
& INET6_ATON(network)INET6_ATON()VARBINARY(16)
UUID操作
MySQL的8.0通過(guò)實(shí)現(xiàn)三個(gè)新的SQL函數(shù)提高UUID操作的易用性:UUID_TO_BIN()师溅,BIN_TO_UUID(),和IS_UUID()盾舌。第一個(gè)從UUID格式化文本轉(zhuǎn)換VARBINARY(16)為第二個(gè)VARBINARY(16)到UUID格式化文本墓臭,最后一個(gè)檢查UUID格式文本的有效性。存儲(chǔ)為a的UUID VARBINARY(16)可以使用功能索引進(jìn)行索引妖谴。功能UUID_TO_BIN()和UUID_TO_BIN()也可以洗牌與時(shí)間相關(guān)的位窿锉,在開(kāi)始移動(dòng)它們使得指數(shù)友好,避免在B樹(shù)中的隨機(jī)插入,這樣降低了插入時(shí)間榆综。這種功能的缺乏被認(rèn)為是使用UUID的缺點(diǎn)之一妙痹。見(jiàn)克特林Besleaga博客文章在這里。
成本模型
查詢優(yōu)化器將數(shù)據(jù)緩沖考慮在內(nèi)
MySQL 8.0根據(jù)有關(guān)數(shù)據(jù)是駐留在內(nèi)存還是磁盤(pán)上的知識(shí)來(lái)選擇查詢計(jì)劃鼻疮。這是自動(dòng)發(fā)生的怯伊,從最終用戶可以看出,沒(méi)有涉及配置判沟。歷史上耿芹,MySQL成本模型假定數(shù)據(jù)駐留在旋轉(zhuǎn)磁盤(pán)上。與在內(nèi)存和磁盤(pán)上查找數(shù)據(jù)相關(guān)的成本常數(shù)現(xiàn)在不同挪哄,因此吧秕,根據(jù)對(duì)數(shù)據(jù)位置的了解,優(yōu)化程序?qū)檫@兩種情況選擇更優(yōu)化的訪問(wèn)方法迹炼。在這里查看?ysteinGr?vlen的博客文章砸彬。
優(yōu)化器直方圖
MySQL 8.0實(shí)現(xiàn)了直方圖統(tǒng)計(jì)。通過(guò)使用直方圖斯入,用戶可以創(chuàng)建表格中列的數(shù)據(jù)分布統(tǒng)計(jì)信息砂碉,通常針對(duì)非索引列進(jìn)行,然后查詢優(yōu)化器將使用這些統(tǒng)計(jì)信息來(lái)查找最佳查詢計(jì)劃刻两。直方圖統(tǒng)計(jì)的主要用途是計(jì)算形式為“COLUMN CONSTANT”的謂詞的選擇性(過(guò)濾效果)增蹭。
用戶通過(guò)ANALYZE TABLE已擴(kuò)展為接受兩個(gè)新子句的語(yǔ)法創(chuàng)建直方圖:UPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS]和DROP HISTOGRAM ON column [, column]。桶的數(shù)量是可選的磅摹,默認(rèn)值是100.直方圖統(tǒng)計(jì)信息存儲(chǔ)在字典表“column_statistics”中滋迈,可通過(guò)視圖訪問(wèn)information_schema.COLUMN_STATISTICS。由于JSON數(shù)據(jù)類型的靈活性户誓,直方圖存儲(chǔ)為JSON對(duì)象饼灿。ANALYZE TABLE 將根據(jù)表大小自動(dòng)決定是否采樣基準(zhǔn)表。它還將根據(jù)數(shù)據(jù)分布和指定的桶數(shù)來(lái)決定是建立一個(gè)singleton還是一個(gè)等高直方圖帝美。在這里可以看到ErikFr?seth的博客文章碍彭。
常用表達(dá)
MySQL的8.0支持UTF8MB4正則表達(dá)式,以及像新的功能REGEXP_INSTR()证舟,REGEXP_LIKE()硕旗,REGEXP_REPLACE(),和REGEXP_SUBSTR()女责。已經(jīng)添加了系統(tǒng)變量regexp_stack_limit(默認(rèn)32步)和regexp_time_limit(默認(rèn)8000000字節(jié))來(lái)控制執(zhí)行漆枚。該REGEXP_REPLACE() 功能是MySQL社區(qū)最需要的功能之一,例如抵知,請(qǐng)參閱由Hans Ginzel 報(bào)告BUG#27389的功能請(qǐng)求墙基。另見(jiàn)馬丁漢森在這里和博爾特馬里烏斯約翰森在這里的博客文章软族。
Dev Ops功能
Dev Ops關(guān)注數(shù)據(jù)庫(kù)的運(yùn)營(yíng)方面,通常涉及可靠性残制,可用性立砸,性能,安全性初茶,可觀察性和可管理性颗祝。高可用性附帶了MySQL InnoDB集群和MySQL組復(fù)制,將由單獨(dú)的博客文章進(jìn)行介紹恼布。下面是8.0在其他類別中帶來(lái)的東西螺戳。
可靠性
MySQL 8.0增加了MySQL的整體可靠性,因?yàn)椋?/p>
MySQL 8.0將其元數(shù)據(jù)存儲(chǔ)到InnoDB中折汞,這是一種久經(jīng)考驗(yàn)的事務(wù)性存儲(chǔ)引擎倔幼。系統(tǒng)表(如Users和Privileges以及Data Dictionary表)現(xiàn)在駐留在InnoDB中。
MySQL 8.0消除了潛在不一致的一個(gè)來(lái)源爽待。在5.7和更早版本中损同,基本上有兩個(gè)數(shù)據(jù)字典,一個(gè)用于服務(wù)器層鸟款,另一個(gè)用于InnoDB層膏燃,在某些崩潰的情況下這些數(shù)據(jù)字典可能不同步。在8.0中只有一個(gè)數(shù)據(jù)字典欠雌。
MySQL 8.0確保原子的蹄梢,崩潰安全的DDL疙筹。有了這個(gè)富俄,用戶可以保證任何DDL語(yǔ)句將被完全執(zhí)行或根本不執(zhí)行。這在復(fù)制環(huán)境中尤為重要而咆,否則可能會(huì)出現(xiàn)主節(jié)點(diǎn)和從節(jié)點(diǎn)(節(jié)點(diǎn))不同步的情況霍比,從而導(dǎo)致數(shù)據(jù)漂移。
這項(xiàng)工作是在新的事務(wù)數(shù)據(jù)字典的背景下完成的暴备。在這里和這里查看Staale Deraas的博客文章悠瞬。
觀測(cè)
信息模式(加速)
MySQL 8.0重新實(shí)現(xiàn)了信息模式。在新的實(shí)現(xiàn)中涯捻,Information Schema表格是存儲(chǔ)在InnoDB中的數(shù)據(jù)字典表的簡(jiǎn)單視圖浅妆。這比舊的實(shí)施效率高出100倍,效率更高障癌。這使信息模式可以通過(guò)外部工具實(shí)際使用凌外。在這里和這里查看Gopal Shankar 的博客文章,以及St?leDeraas 在這里的博客文章涛浙。
性能架構(gòu)(加速)
MySQL 8.0通過(guò)在性能架構(gòu)表上添加超過(guò)100個(gè)索引來(lái)加速性能架構(gòu)查詢康辑。性能架構(gòu)表上的索引是預(yù)定義的摄欲。他們不能被刪除,添加或更改疮薇。性能模式索引是作為對(duì)現(xiàn)有表數(shù)據(jù)的過(guò)濾掃描來(lái)實(shí)現(xiàn)的胸墙,而不是通過(guò)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷。沒(méi)有B樹(shù)或散列表需要構(gòu)建按咒,更新或以其他方式管理迟隅。性能架構(gòu)表索引在散列索引中的行為如下:a)它們快速檢索所需的行,并且b)不提供行排序励七,并在必要時(shí)讓服務(wù)器對(duì)結(jié)果集進(jìn)行排序玻淑。但是,根據(jù)查詢呀伙,索引可以避免使用全表掃描补履,并返回相當(dāng)小的結(jié)果集。性能模式索引可用SHOW INDEXES并在EXPLAIN輸出中表示引用索引列的查詢剿另。見(jiàn)Simon Mudd的評(píng)論箫锤。在這里查看Marc Alff的博文。
配置變量
MySQL的8.0增加了對(duì)配置變量雨女,如變量名谚攒,有用的信息最小/最大值,這里 的電流值是從哪里來(lái)的氛堕, 誰(shuí)進(jìn)行了更改馏臭,并在它被做。該信息位于名為的新性能模式表中 variables_info讼稚。在這里可以看到Satish Bharathy的博客文章括儒。
客戶端錯(cuò)誤報(bào)告 - 消息計(jì)數(shù)
MySQL 8.0可以查看服務(wù)器報(bào)告的客戶端錯(cuò)誤消息的聚合計(jì)數(shù) 。用戶可以查看來(lái)自5個(gè)不同表格的統(tǒng)計(jì)信息:全局計(jì)數(shù)锐想,每個(gè)線程的匯總帮寻,每個(gè)用戶的匯總,每個(gè)主機(jī)的匯總或每個(gè)賬戶的匯總赠摇。對(duì)于每條錯(cuò)誤消息固逗,用戶都可以看到引發(fā)錯(cuò)誤的數(shù)量,由SQL異常處理程序處理的錯(cuò)誤數(shù)藕帜,“首次看到”時(shí)間戳和“上次看到”時(shí)間戳烫罩。給定正確的權(quán)限,用戶可以SELECT從這些表TRUNCATE中重置統(tǒng)計(jì)信息洽故。在這里可以看到Mayank Prasad的博客文章贝攒。
語(yǔ)句延遲柱狀圖
為了更好地查看查詢響應(yīng)時(shí)間,MySQL 8.0提供了語(yǔ)句延遲的性能模式直方圖收津。這項(xiàng)工作還從收集的直方圖中計(jì)算“P95”饿这,“P99”和“P999”百分位數(shù)浊伙。這些百分比可以用作服務(wù)質(zhì)量的指標(biāo)。見(jiàn)弗雷德里克DESCAMPS博客文章在這里长捧。
數(shù)據(jù)鎖定相關(guān)性圖
MySQL 8.0儀器數(shù)據(jù)鎖定在性能模式中嚣鄙。當(dāng)事務(wù)A鎖定R行,并且事務(wù)B在這個(gè)同一行上等待時(shí)串结,B被A有效阻止哑子。添加的檢測(cè)揭示哪些數(shù)據(jù)被鎖定(R),誰(shuí)擁有鎖(A)肌割,誰(shuí)在等待數(shù)據(jù)(B)卧蜓。見(jiàn)弗雷德里克DESCAMPS博客文章在這里。
摘要查詢示例
MySQL 8.0對(duì)events_statements_summary_by_digest性能模式表進(jìn)行了一些更改把敞,以捕獲完整的示例查詢和關(guān)于此查詢示例的一些關(guān)鍵信息弥奸。QUERY_SAMPLE_TEXT添加該列以捕獲查詢示例,以便用戶可以在真實(shí)查詢上運(yùn)行EXPLAIN并獲取查詢計(jì)劃奋早。該列QUERY_SAMPLE_SEEN被添加以捕獲查詢樣本時(shí)間戳盛霎。該列QUERY_SAMPLE_TIMER_WAIT被添加以捕獲查詢樣本執(zhí)行時(shí)間。列FIRST_SEEN和LAST_SEEN 已被修改為使用小數(shù)秒耽装。見(jiàn)弗雷德里克DESCAMPS博客文章 在這里愤炸。
有關(guān)儀器的元數(shù)據(jù)
MySQL 8.0將元數(shù)據(jù)(如屬性,易變性和文檔)添加到性能架構(gòu)表 setup_instruments掉奄。這種只讀元數(shù)據(jù)可作為儀器的在線文檔规个,供用戶或工具查看。見(jiàn)弗雷德里克DESCAMPS博客文章在這里姓建。
錯(cuò)誤記錄
MySQL 8.0對(duì)MySQL 錯(cuò)誤日志進(jìn)行了重大改進(jìn)诞仓。從軟件體系結(jié)構(gòu)的角度來(lái)看,錯(cuò)誤日志是新服務(wù)基礎(chǔ)架構(gòu)中的一個(gè)組件引瀑。這意味著高級(jí)用戶可以根據(jù)需要編寫(xiě)自己的錯(cuò)誤日志實(shí)現(xiàn)狂芋。大多數(shù)用戶不想編寫(xiě)他們自己的錯(cuò)誤日志實(shí)現(xiàn)榨馁,但仍然希望在編寫(xiě)和編寫(xiě)它的地方有一定的靈活性憨栽。因此,8.0為用戶提供設(shè)施來(lái)添加匯(哪里)和過(guò)濾器(什么)翼虫。MySQL 8.0實(shí)現(xiàn)了一個(gè)過(guò)濾服務(wù)(API)和一個(gè)默認(rèn)的過(guò)濾服務(wù)實(shí)現(xiàn)(組件)屑柔。這里的過(guò)濾意味著禁止給定日志消息(投影)中的某些日志消息(選擇)和/或字段。MySQL 8.0實(shí)現(xiàn)了日志編寫(xiě)器服務(wù)(API)和默認(rèn)日志編寫(xiě)器服務(wù)實(shí)現(xiàn)(組件)珍剑。日志編寫(xiě)者接受日志事件并將其寫(xiě)入日志掸宛。該日志可以是經(jīng)典文件,syslog招拙,EventLog和新的JSON日志編寫(xiě)器唧瘾。
默認(rèn)情況下措译,沒(méi)有任何配置,MySQL 8.0提供了許多現(xiàn)成的錯(cuò)誤日志改進(jìn)饰序,例如:
錯(cuò)誤編號(hào):格式是10000系列中以“MY-”開(kāi)頭的數(shù)字领虹,例如“MY-10001”。GA版本中的錯(cuò)誤編號(hào)將保持穩(wěn)定求豫,但在維護(hù)版本中允許相應(yīng)的錯(cuò)誤文本發(fā)生變化(即改進(jìn))塌衰。
系統(tǒng)消息:系統(tǒng)消息以[系統(tǒng)]而不是[錯(cuò)誤],[警告]蝠嘉,[注意]的形式寫(xiě)入錯(cuò)誤日志最疆。無(wú)論詳細(xì)情況如何,都會(huì)打印[系統(tǒng)]和[錯(cuò)誤]消息蚤告,且無(wú)法取消努酸。[系統(tǒng)]消息僅在少數(shù)地方使用,主要與主要狀態(tài)轉(zhuǎn)換相關(guān)杜恰,例如啟動(dòng)或停止服務(wù)器蚊逢。
減少詳細(xì)程度:log_error_verbosity的默認(rèn)值從3(注釋)變?yōu)?(警告)。這使得MySQL 8.0錯(cuò)誤日志在默認(rèn)情況下不會(huì)變得冗長(zhǎng)箫章。
源組件:每個(gè)消息都用三個(gè)值[Server]烙荷,[InnoDB],[Replic]中的一個(gè)注釋來(lái)顯示消息來(lái)自哪個(gè)子系統(tǒng)檬寂。
這是啟動(dòng)后寫(xiě)入8.0 GA錯(cuò)誤日志的內(nèi)容:
2018-03-08T10:14:29.289863Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.5) starting as process 8063
2018-03-08T10:14:29.745356Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-03-08T10:14:29.765159Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.5' socket: '/tmp/mysql.sock' port: 3306 Source distribution.
2018-03-08T10:16:51.343979Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.5) Source distribution.
1
2
3
4
2018-03-08T10:14:29.289863Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.5) starting as process 8063
2018-03-08T10:14:29.745356Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-03-08T10:14:29.765159Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.5' socket: '/tmp/mysql.sock' port: 3306 Source distribution.
2018-03-08T10:16:51.343979Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.5) Source distribution.
在錯(cuò)誤日志中引入錯(cuò)誤編號(hào)可以讓MySQL在即將發(fā)布的維護(hù)版本(如果需要)中改進(jìn)錯(cuò)誤文本终抽,同時(shí)保持錯(cuò)誤編號(hào)(ID)不變。錯(cuò)誤編號(hào)也是過(guò)濾/壓制和國(guó)際化/本地化的基礎(chǔ)桶至。
可管理性
INVISIBLE索引
MySQL 8.0增加了切換索引可見(jiàn)性(可見(jiàn)/不可見(jiàn))的功能昼伴。優(yōu)化器在執(zhí)行查詢執(zhí)行計(jì)劃時(shí)不會(huì)考慮不可見(jiàn)索引。但是镣屹,該指數(shù)仍保留在后臺(tái)圃郊,因此再次顯示該指標(biāo)非常便宜。這樣做的目的是讓DBA / DevOp確定是否可以刪除索引女蜈。如果您懷疑沒(méi)有使用索引持舆,則首先使其不可見(jiàn),然后監(jiān)視查詢性能伪窖,如果沒(méi)有遇到查詢減慢的情況逸寓,最后刪除索引。很多用戶都要求這個(gè)功能覆山,例如Bug#70299竹伸。請(qǐng)參閱Martin Hansson 在這里發(fā)表的博文。
靈活撤消表空間管理
MySQL 8.0為用戶提供了完全控制撤消表空間的能力簇宽,例如勋篓,有多少個(gè)表空間吧享,它們放置在哪里以及每個(gè)表空間的回滾段數(shù)。
不再有撤消登錄系統(tǒng)表空間譬嚣。撤消日志在升級(jí)過(guò)程中從系統(tǒng)表空間遷移到撤消表空間耙蔑。這為使用用于撤消日志的系統(tǒng)表空間的現(xiàn)有5.7安裝提供了升級(jí)路徑。
撤銷表空間可以與系統(tǒng)表空間分開(kāi)管理孤荣。例如甸陌,撤消表空間可以放在快速存儲(chǔ)上。
回收異常大型交易占用的空間(在線)盐股。創(chuàng)建至少兩個(gè)撤銷表空間以允許表空間截?cái)嗲怼_@允許InnoDB收縮撤消表空間,因?yàn)橐粋€(gè)撤消表空間可以被激活而另一個(gè)被截?cái)唷?br>
更多的回滾段導(dǎo)致?tīng)?zhēng)用更少疯汁。用戶可能會(huì)選擇最多127個(gè)撤消表空間绽族,每個(gè)表空間最多有128個(gè)回滾段陪腌。更多的回滾段意味著并發(fā)事務(wù)更可能為其撤消日志使用單獨(dú)的回滾段望众,從而減少對(duì)相同資源的爭(zhēng)用未斑。
在這里查看凱文劉易斯的博客文章。
SET PERSIST用于全局變量
MySQL 8.0使持久化全局動(dòng)態(tài)服務(wù)器變量成為可能溢豆。許多服務(wù)器變量都是GLOBAL和DYNAMIC蜒简,可以在服務(wù)器運(yùn)行時(shí)重新配置。例如:SET GLOBAL sql_mode='STRICT_TRANS_TABLES'; 但是漩仙,重新啟動(dòng)服務(wù)器時(shí)會(huì)丟失這些設(shè)置搓茬。
這項(xiàng)工作使得寫(xiě)入成為可能SET PERSIST sql_mode='STRICT_TRANS_TABLES'; 的結(jié)果是,該設(shè)置將在服務(wù)器重新啟動(dòng)后存活队他。該功能有許多使用場(chǎng)景卷仑,但最重要的是,它提供了一種管理服務(wù)器設(shè)置的方法麸折,當(dāng)編輯配置文件不方便或不可選時(shí)锡凝。例如,在某些托管環(huán)境中垢啼,您不具有文件系統(tǒng)訪問(wèn)權(quán)限窜锯,您擁有的只是能夠連接到一臺(tái)或多臺(tái)服務(wù)器。至于SET GLOBAL你需要超級(jí)特權(quán)SET PERSIST膊夹。
還有RESET PERSIST命令衬浑。該RESET PERSIST命令具有從持久配置中除去配置變量的語(yǔ)義,從而將其轉(zhuǎn)換為具有與之類似的行為SET GLOBAL放刨。
MySQL 8.0允許SET PERSIST設(shè)置大多數(shù)只讀變量,新值將在下次服務(wù)器重啟時(shí)生效尸饺。請(qǐng)注意进统,只有一小部分只讀變量是故意不可設(shè)置的助币。在這里可以看到Satish Bharathy的博客文章。
遠(yuǎn)程管理
MySQL 8.0實(shí)現(xiàn)了一個(gè)SQL RESTART命令螟碎。目的是通過(guò)SQL連接啟用MySQL服務(wù)器的遠(yuǎn)程管理眉菱,例如通過(guò)SET PERSIST后面的a 來(lái)設(shè)置非動(dòng)態(tài)配置變量RESTART。查看博客文章 MySQL 8.0:輕松更改配置和云端友好掉分! 由FrédéricDescamps提供俭缓。
重命名表空間(SQL DDL)
MySQL 8.0實(shí)現(xiàn)ALTER TABLESPACE s1 RENAME TO s2;共享/常規(guī)表空間是一個(gè)用戶可見(jiàn)的實(shí)體,用戶可以通過(guò)該實(shí)體創(chuàng)建酥郭,修改和刪除华坦。請(qǐng)參閱錯(cuò)誤#26949,錯(cuò)誤#32497和錯(cuò)誤#58006不从。
重命名列(SQL DDL)
MySQL 8.0實(shí)現(xiàn)ALTER TABLE ... RENAME COLUMN old_name TO new_name;這是對(duì)現(xiàn)有語(yǔ)法ALTER TABLE <table_name> CHANGE ...的改進(jìn)惜姐,它需要重新指定列的所有屬性。舊的/現(xiàn)有的語(yǔ)法的缺點(diǎn)是所有的列信息可能無(wú)法用于嘗試重命名的應(yīng)用程序椿息。舊/現(xiàn)有語(yǔ)法中的意外數(shù)據(jù)類型更改也有可能導(dǎo)致數(shù)據(jù)丟失的風(fēng)險(xiǎn)歹袁。
安全功能
新的默認(rèn)身份驗(yàn)證插件
MySQL 8.0將默認(rèn)身份驗(yàn)證插件從mysql_native_password更改為caching_sha2_password。相應(yīng)地寝优,libmysqlclient也會(huì)使用caching_sha2_password作為默認(rèn)的認(rèn)證機(jī)制条舔。新的caching_sha2_password結(jié)合了更高的安全性(SHA2算法)和高性能(緩存)》Ψ總的方向是我們建議所有用戶在他們的所有網(wǎng)絡(luò)通信中使用TLS / SSL逞刷。在這里可以看到Harin Vadodaria的博客文章。
Community Edition中的默認(rèn)OpenSSL
MySQL 8.0在OpenSSL上統(tǒng)一為MySQL企業(yè)版和MySQL社區(qū)版的默認(rèn)TLS / SSL庫(kù)妻熊。以前夸浅,MySQL社區(qū)版使用YaSSL。在MySQL Community Edition中支持OpenSSL一直是最常用的功能之一扔役。見(jiàn)弗雷德里克DESCAMPS博客文章在這里帆喇。
OpenSSL是動(dòng)態(tài)鏈接的
MySQL 8.0與OpenSSL動(dòng)態(tài)鏈接。從MySQL Repository用戶的角度來(lái)看亿胸,MySQL包依賴于Linux系統(tǒng)提供的OpenSSL文件坯钦。通過(guò)動(dòng)態(tài)鏈接,可以在不需要MySQL升級(jí)或補(bǔ)丁的情況下應(yīng)用OpenSSL更新侈玄。見(jiàn)弗雷德里克DESCAMPS博客文章在這里婉刀。
撤消和重做日志的加密
MySQL 8.0實(shí)現(xiàn)了UNDO和REDO日志的靜態(tài)數(shù)據(jù)加密。在5.7中序仙,我們引入了存儲(chǔ)在每個(gè)表文件表空間中的InnoDB表的表空間加密突颊。此功能為物理表空間數(shù)據(jù)文件提供靜態(tài)加密。在8.0中,我們將其擴(kuò)展為包括UNDO和REDO日志律秃。在這里看到文檔爬橡。
SQL角色
MySQL 8.0實(shí)現(xiàn)SQL角色。角色是指定的特權(quán)集合棒动。目的是簡(jiǎn)化用戶訪問(wèn)權(quán)限管理糙申。可以為用戶授予角色船惨,授予角色權(quán)限柜裸,創(chuàng)建角色,刪除角色以及決定會(huì)話期間適用的角色粱锐。見(jiàn)弗雷德里克DESCAMPS博客文章在這里疙挺。
允許授予和撤銷PUBLIC
MySQL 8.0引入了配置變量mandatory-roles,可以在創(chuàng)建新用戶時(shí)用于自動(dòng)分配和授予默認(rèn)角色卜范。例如:衔统。所有指定的角色總是被視為授予每個(gè)用戶,他們不能被撤銷海雪。除非將這些角色設(shè)為默認(rèn)角色锦爵,否則這些角色仍需要激活。當(dāng)新服務(wù)器配置變量設(shè)置為“ON”時(shí)奥裸,所有授權(quán)角色始終在用戶通過(guò)身份驗(yàn)證后激活险掀。role1@%,role2,role3,role4@localhostactivate-all-roles-on-login
打破超級(jí)特權(quán)
MySQL 8.0為以前版本中使用的SUPER的各個(gè)方面定義了一組新的粒度特權(quán)。目的是限制用戶對(duì)手頭工作所需要的訪問(wèn)權(quán)限湾宙,僅此而已樟氢。例如BINLOG_ADMIN,CONNECTION_ADMIN和ROLE_ADMIN侠鳄。
管理XA事務(wù)的授權(quán)模型
MySQL 8.0引入了一個(gè)新的系統(tǒng)特權(quán)XA_RECOVER_ADMIN來(lái)控制執(zhí)行語(yǔ)句的能力XA RECOVER埠啃。XA RECOVER未被授予新系統(tǒng)特權(quán)的用戶所做的嘗試XA_RECOVER_ADMIN將導(dǎo)致錯(cuò)誤。
密碼輪換政策
MySQL 8.0引入了密碼重用的限制伟恶〔昕可以在全局級(jí)別以及單個(gè)用戶級(jí)別配置限制。密碼歷史保持安全博秫,因?yàn)樗赡軙?huì)提供有關(guān)個(gè)人用戶更改密碼時(shí)使用的習(xí)慣或模式的線索潦牛。該密碼輪換政策來(lái)除了其他現(xiàn)有機(jī)制,如密碼過(guò)期策略和允許的密碼策略挡育。請(qǐng)參閱密碼管理巴碗。
減緩用戶密碼的暴力攻擊
基于連續(xù)不成功的登錄嘗試,MySQL 8.0在認(rèn)證過(guò)程中引入了延遲即寒。目的是減緩對(duì)用戶密碼的暴力攻擊橡淆≌儇可以配置延遲引入之前的連續(xù)不成功嘗試的次數(shù),以及引入的最大延遲量明垢。
退休跳過(guò)授予表
服務(wù)器啟動(dòng)時(shí)蚣常,MySQL 8.0不允許遠(yuǎn)程連接–skip-grant-tables市咽。參見(jiàn)Omar Bourja報(bào)告的Bug# 79027痊银。
將mysqld_safe功能添加到服務(wù)器
MySQL 8.0實(shí)現(xiàn)了當(dāng)前在mysqld_safe服務(wù)器內(nèi)腳本中找到的部分邏輯。這些工作提高了服務(wù)器的可用性施绎,例如在使用--daemonize啟動(dòng)選項(xiàng)時(shí)溯革。這項(xiàng)工作還使用戶對(duì)mysqld_safe script我們希望在未來(lái)消除的依賴性減少。它還修復(fù)了Peter Laursen報(bào)告的Bug#75343谷醉。
性能
MySQL 8.0具有更好的讀/寫(xiě)工作負(fù)載致稀,IO綁定工作負(fù)載和高爭(zhēng)用“熱點(diǎn)”工作負(fù)載的性能。此外俱尼,新的資源組功能為用戶提供了一個(gè)選項(xiàng)抖单,可以通過(guò)將用戶線程映射到CPU來(lái)針對(duì)特定硬件上的特定工作負(fù)載進(jìn)行優(yōu)化。
擴(kuò)展讀/寫(xiě)工作負(fù)載
MySQL 8.0在RW和繁重的寫(xiě)入工作負(fù)載上可以很好地?cái)U(kuò)展遇八。在密集RW工作負(fù)載上矛绘,我們觀察到來(lái)自4個(gè)并發(fā)用戶的性能更好,與MySQL 5.7相比刃永,在高負(fù)載情況下性能提高了2倍以上货矮。我們可以說(shuō),雖然5.7只讀工作負(fù)載的可伸縮性顯著提高斯够,但8.0顯著提高了讀/寫(xiě)工作負(fù)載的可伸縮性囚玫。其效果是MySQL提高了標(biāo)準(zhǔn)服務(wù)器端硬件(如帶有2個(gè)CPU插槽的系統(tǒng))的硬件利用率(效率)。這種改進(jìn)是由于重新設(shè)計(jì)InnoDB如何寫(xiě)入REDO日志读规。與用戶線程不斷努力記錄其數(shù)據(jù)更改的歷史實(shí)現(xiàn)相比抓督,在新的REDO日志解決方案中,用戶線程現(xiàn)在是無(wú)鎖的束亏,REDO寫(xiě)入和刷新由專用后臺(tái)線程管理铃在,整個(gè)REDO處理變?yōu)槭录?qū)動(dòng)。請(qǐng)參閱Dimitri Kravtchuk的博客文章這里枪汪。
利用IO容量(快速存儲(chǔ))
MySQL 8.0允許用戶使用每個(gè)存儲(chǔ)設(shè)備的全部功能涌穆。例如,使用英特爾Optane閃存設(shè)備進(jìn)行測(cè)試雀久,我們能夠在完全I(xiàn)O界限工作負(fù)載下超出1M點(diǎn)選QPS宿稀。(IO界限意味著數(shù)據(jù)不緩存在緩沖池中,但必須從輔助存儲(chǔ)中檢索)赖捌。這種改進(jìn)是由于擺脫了 fil_system_mutex全局鎖定祝沸。
高競(jìng)爭(zhēng)負(fù)載下性能更佳(“熱門(mén)行”)
MySQL 8.0顯著提高了高爭(zhēng)用工作負(fù)載的性能矮烹。當(dāng)多個(gè)事務(wù)正在等待表中同一行上的鎖定時(shí),會(huì)發(fā)生較高的爭(zhēng)用工作負(fù)載罩锐,從而導(dǎo)致等待事務(wù)隊(duì)列奉狈。許多真實(shí)世界的工作量在一天中并不平滑,但可能會(huì)在特定時(shí)間爆發(fā)(帕累托分布式)涩惑。無(wú)論是在每秒事務(wù)處理時(shí)間仁期,平均延遲時(shí)間和第95百分位延遲方面,MySQL 8.0的處理都要好得多竭恬。由于系統(tǒng)需要較少的備用容量跛蛋,因此可以以較高的平均負(fù)載運(yùn)行,因此對(duì)最終用戶的好處是更好的硬件利用率(效率)痊硕。最初的補(bǔ)丁由Jiamin Huang提供(Bug#84266)赊级。請(qǐng)研究Contention-Aware事務(wù)調(diào)度(CATS)算法,并在此處閱讀Jiamin Huang和Sunny Bains撰寫(xiě)的MySQL博客文章岔绸。
資源組
MySQL 8.0引入了全球資源組到MySQL理逊。通過(guò)資源組,DevOps / DBA可以管理用戶/系統(tǒng)線程和CPU之間的映射盒揉。這可用于跨CPU分割工作負(fù)載晋被,以在某些使用情況下獲得更高的效率和/或性能。因此预烙,資源組向DBA工具箱添加了一個(gè)工具墨微,該工具可以幫助DBA增加硬件利用率或提高查詢穩(wěn)定性。例如扁掸,通過(guò)在英特爾(R)至強(qiáng)?CPU E7-4860 2.27 GHz 40核心-HT盒上運(yùn)行的Sysbench RW工作負(fù)載翘县,通過(guò)將寫(xiě)入負(fù)載限制為10個(gè)內(nèi)核,我們使整體吞吐量翻了一番谴分。資源組是一個(gè)相當(dāng)先進(jìn)的工具锈麸,需要熟練的DevOps / DBA才能有效使用,因?yàn)樾Ч麜?huì)隨著負(fù)載類型和手頭硬件而變化牺蹄。
其他特性
更好的默認(rèn)值
在MySQL團(tuán)隊(duì)中忘伞,我們密切關(guān)注MySQL的默認(rèn)配置,旨在為用戶提供最佳的現(xiàn)成體驗(yàn)沙兰。MySQL 8.0將30多個(gè)默認(rèn)值更改為我們認(rèn)為更好的值氓奈。請(qǐng)參閱博客文章MySQL 8.0中的New Defaults。Mogan Tocker 在博客文章中概述了這一動(dòng)機(jī)鼎天。
協(xié)議
MySQL 8.0添加了一個(gè)選項(xiàng)來(lái)關(guān)閉結(jié)果集的元數(shù)據(jù)生成和傳輸舀奶。構(gòu)造/解析和發(fā)送/接收結(jié)果集元數(shù)據(jù)會(huì)消耗服務(wù)器,客戶端和網(wǎng)絡(luò)資源斋射。在某些情況下育勺,元數(shù)據(jù)大小可能比實(shí)際結(jié)果數(shù)據(jù)大小大得多但荤,元數(shù)據(jù)不需要。我們可以通過(guò)完全禁用這些數(shù)據(jù)的生成和存儲(chǔ)來(lái)顯著加快查詢結(jié)果傳輸速度涧至「乖辏客戶可以設(shè)置CLIENT_OPTIONAL_RESULTSET_METADATA標(biāo)志,如果他們不希望元數(shù)據(jù)返回結(jié)果集南蓬。
C客戶端API
MySQL 8.0通過(guò)一個(gè)穩(wěn)定的接口擴(kuò)展了libmysql的C API纺非,以便從服務(wù)器獲取作為數(shù)據(jù)包流的復(fù)制事件。目的是為了避免必須調(diào)用未記錄的API并打包內(nèi)部頭文件以實(shí)現(xiàn)基于binlog的程序蓖康,例如Hadoop的MySQL Applier铐炫。
Memcached的
MySQL 8.0通過(guò)多個(gè)獲取操作并支持范圍查詢來(lái)增強(qiáng)InnoDB Memcached功能垒手。我們添加了對(duì)多重get操作的支持蒜焊,以進(jìn)一步提高讀取性能,即用戶可以在單個(gè)memcached查詢中獲取多個(gè)鍵值對(duì)科贬。Yoshinori @ Facebook已經(jīng)要求支持范圍查詢泳梆。通過(guò)范圍查詢,用戶可以指定特定的范圍榜掌,并獲取該范圍內(nèi)的所有合格值优妙。這兩個(gè)功能都可以顯著減少客戶端和服務(wù)器之間往返的次數(shù)。
持久的自動(dòng)計(jì)數(shù)器
MySQL 8.0 AUTOINC通過(guò)將計(jì)數(shù)器寫(xiě)入重做日志來(lái)保留計(jì)數(shù)器憎账。這是一個(gè)很老的Bug#199的修復(fù)程序套硼。MySQL恢復(fù)過(guò)程將重播重做日志并確保AUTOINC計(jì)數(shù)器的值正確。不會(huì)有任何AUTOINC計(jì)數(shù)器回滾胞皱。這意味著數(shù)據(jù)庫(kù)恢復(fù)將在崩潰后重新建立最新的已知計(jì)數(shù)器值邪意。它帶有保證AUTOINC計(jì)數(shù)器不能獲得兩次相同的值。計(jì)數(shù)器單調(diào)遞增反砌,但請(qǐng)注意可能存在空位(未使用的值)雾鬼。缺乏持久性AUTOINC在過(guò)去被視為麻煩,例如宴树,參見(jiàn)Stephen Dewey在2006年或本博客文章中報(bào)告的Bug#21641策菜。
https://blogs.oracle.com/mysql/announcing-general-availability-of-mysql-80
https://www.sdbeta.com/wg/2018/0420/222014.html