MySQL 8.0有什么新功能


  https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

我們自豪地宣布MySQL 8.0的一般可用性。 現在下載! MySQL 8.0是世界上最受歡迎的開源數據庫中令人興奮的新版本,並且全面改進。一些關鍵的增強功能包括:

  1. SQL 窗口函數,公用表表達式,NOWAIT和SKIP LOCKED,降序索引,分組,正則表達式,字符集,成本模型和直方圖。
  2. JSON 擴展語法,新功能,改進的排序和部分更新。使用JSON表函數,您可以將SQL機制用於JSON數據。
  3. GIS 地理支持。空間參考系統(SRS),以及SRS感知空間數據類型,空間索引和空間函數。
  4. 可靠性 DDL語句已成為原子和崩潰安全,元數據存儲在單個事務數據字典中。由InnoDB提供支持!
  5. 可觀察性 性能模式,信息模式,配置變量和錯誤記錄的顯着增強。
  6.  管理遠程管理,撤消表空間管理和新的即時DDL。
  7. 安全性 OpenSSL改進,新的默認身份驗證,SQL角色,分解超級權限,密碼強度等。
  8. Performance InnoDB在讀/寫工作負載,IO綁定工作負載和高爭用“熱點”工作負載方面表現更佳。添加了資源組功能,通過將用戶線程映射到CPU,為用戶提供了針對特定硬件上的特定工作負載進行優化的選項。

上面描述了一些亮點,我鼓勵你進一步深入到完整的系列里程碑博客文章-8.0.0的 8.0.1 ,8.0.2 ,8.0.3,and8.0.4 -和甚至進一步下降到各個工作 日志 及其規格和實施細節。或者您可能只想查看github.com/mysql上的源代碼 

開發者功能

MySQL開發人員需要新功能,MySQL 8.0在SQL,JSON,正則表達式和GIS等領域提供了許多新的和備受歡迎的功能。開發人員也希望能夠存儲Emojis,因此UTF8MB4現在是8.0中的默認字符集。最后,數據類型有了改進,對BINARY數據類型進行了逐位操作,並改進了IPv6和UUID函數。

SQL

窗口功能

MySQL 8.0提供SQL窗口功能。與分組聚合函數類似,窗口函數對一組行執行一些計算,例如COUNT 或 SUM 。但是,如果分組聚合將這組行折疊為單行,則窗口函數將對結果集中的每一行執行聚合。

窗口函數有兩種形式:用作窗口函數的SQL聚合函數和專用窗口函數。這是MySQL中支持窗口的一組聚合函數: COUNT , SUM , AVG , MIN , MAX , BIT_OR , BIT_AND , BIT_XOR ,STDDEV_POP (及其同義詞 STD , STDDEV ), STDDEV_SAMP , VAR_POP (及其同義詞 VARIANCE )和 VAR_SAMP 。一組專門的窗口函數是: RANK , DENSE_RANK , PERCENT_RANK , CUME_DIST ,NTILE , ROW_NUMBER , FIRST_VALUE , LAST_VALUE , NTH_VALUE , LEAD 和 LAG

對窗口函數(也稱為分析函數)的支持是頻繁的用戶請求。窗口函數長期以來一直是標准SQL(SQL 2003)的一部分。請參閱Dag Wanvikhere的博客文章以及Guilhem Bichothere的博客文章。

公用表表達式

MySQL 8.0提供[遞歸]公用表表達式(CTE)。非遞歸CTE可以解釋為“改進的派生表”,因為它允許多次引用派生表。遞歸CTE是一組迭代構建的行:從一組初始行開始,一個進程派生新行,這些行增長了這一組,並​​且這些新行再次被送入進程,產生更多行,依此類推,直到該過程不再產生行。CTE是常用的SQL功能,請參閱功能請求 16244 和 32174 。查看Guilhem Bichothere的博客文章, 這里 ,這里,和其他地方。

NOWAIT和SKIP LOCKED

MySQL的8.0提供了 NOWAIT 與 SKIP LOCKED 該SQL鎖定子句中的替代品。通常,當一行因a UPDATE 或a 而被鎖定時 SELECT ... FOR UPDATE ,任何其他事務都必須等待訪問該鎖定行。在某些用例中,如果行被鎖定或忽略鎖定的行,則需要立即返回。使用的鎖定子句 NOWAIT 永遠不會等待獲取行鎖。相反,查詢將失敗並顯示錯誤。使用的鎖定子句 SKIP LOCKED 永遠不會等待獲取列出的表上的行鎖。而是跳過鎖定的行,根本不讀取。NOWAIT和SKIP LOCKED經常被要求SQL功能。請參閱功能請求 49763 。我們還要感謝 Kyle Oppenheim  為他的代碼貢獻!請參閱Martin Hanssonhere的博客文章。

降序索引

MySQL 8.0按降序提供對索引的支持。這種索引中的值按降序排列,我們向前掃描。在8.0之前,當用戶創建降序索引時,我們創建了一個升序索引並向后掃描它。一個好處是前向索引掃描比后向索引掃描更快。真正的降序索引的另一個好處是它使我們能夠使用索引而不是filesort來處理ORDER BY 具有混合ASC/DESC 排序鍵部分的 子句 。 降序索引 是一種經常請求的SQL功能。參見例如特征請求 13375 。請參閱Chaithra Gopalareddy的博客文章。

GROUPING

MySQL 8.0提供 GROUPING() , SQL_FEATURE T433 。該 GROUPING() 函數將超級聚合行與常規分組行區分開來。 GROUP BY 擴展,例如 ROLLUP 生成超級聚合行,其中所有值的集合由null表示。使用該 GROUPING() 函數,您可以區分表示超級聚合行中所有值的集合的空值與 NULL 常規行中的值。GROUPING是一種經常請求的SQL功能。請參閱功能請求 3156 和 46053 。感謝 Zoe Dong 和 Shane Adams 在功能請求46053中的代碼貢獻 請參閱Chaithra Gopalareddy的博客文章。

優化器提示

在5.7中,我們為優化器提示引入了一個新的提示語法 使用新語法,可以SELECT | INSERT | REPLACE | UPDATE | DELETE 在SQL語句中關鍵字之后直接指定提示,這些 關鍵字包含在 /*+ */ 樣式注釋中。(見Sergey Glukhovhere的5.7篇博文)。在MySQL 8.0中,我們通過充分利用這種新風格來完成圖片:

  • MySQL 8.0為INDEX_MERGE 和 添加了提示 NO_INDEX_MERGE 。這允許用戶在不更改優化器開關的情況下控制單個查詢的索引合並行為。
  • MySQL的8.0增加了用於提示 JOIN_FIXED_ORDER , JOIN_ORDER , JOIN_PREFIX ,和JOIN_SUFFIX 。這允許用戶控制連接執行的表順序。
  • MySQL 8.0添加了一個名為的提示 SET_VAR 。該 SET_VAR 提示將針對只剩下一語句給定的系統變量設置的值。因此,在語句結束后,該值將重置為之前的值。請參閱Sergey Glukhovhere的博客文章。

我們更喜歡新格式的優化器提示,而不是舊式提示和 值設置 通過不與SQL混合,可以在查詢字符串中的許多位置注入新提示。它們在提示(vs指令)時也有更清晰的語義。optimizer_switch

JSON

MySQL 8.0添加了新的JSON函數,並提高了對JSON值進行排序和分組的性能​​。

JSON路徑表達式中范圍的擴展語法

MySQL 8.0擴展了JSON路徑表達式中范圍的語法。例如 SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]'); 結果 [2, 3, 4] 。引入的新語法是SQL標准語法的一個子集,在SQL:2016,9.39中描述了SQL / JSON路徑語言:語法和語義。另見 Roland Bouman報道的Bug#79052

JSON表函數

MySQL 8.0添加了JSON表函數,可以使用SQL機制來處理JSON數據。 JSON_TABLE() 創建JSON數據的關系視圖。它將JSON數據評估的結果映射到關系行和列。用戶可以使用SQL查詢函數返回的結果作為常規關系表,例如join,project和aggregate。

JSON聚合函數

MySQL 8.0添加了聚合函數 JSON_ARRAYAGG() 來生成JSON數組並 JSON_OBJECTAGG() 生成JSON對象。這使得可以將多行中的JSON文檔組合成JSON數組或JSON對象。請參閱Catalin Besleagahere的博客文章。

JSON合並函數

該 JSON_MERGE_PATCH() 函數實現了RFC7396指定的JavaScript(和其他腳本語言)的 語義 ,即它通過第二個文檔的優先級刪除重復項。例如, 。 JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}

該 JSON_MERGE_PRESERVE() 函數具有在MySQL 5.7中實現的JSON_MERGE()的語義,例如,它保留所有值  JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.

JSON_MERGE() MySQL 8.0中不推薦使用 現有 函數來消除合並操作的歧義。另見Bug#81283中的提案 和Morgan Tockerhere的博客文章。

JSON漂亮功能

MySQL 8.0 JSON_PRETTY() 在MySQL中添加了一個 函數。該函數接受JSON本機數據類型或JSON的字符串表示形式,並以人類可讀的方式返回JSON格式的字符串,並帶有新行和縮進。

JSON大小函數

MySQL 8.0添加了與給定JSON對象的空間使用相關的JSON函數。該 JSON_STORAGE_SIZE() 回報的JSON數據類型字節的實際大小。在 JSON_STORAGE_FREE() 返回以字節為單位,包括分段和填充保存就地更新一個JSON二進制類型的自由空間。

JSON改進了排序

MySQL 8.0通過使用可變長度排序鍵為JSON值排序/分組提供了更好的性能。初步基准測試表明,根據使用情況,分類改進了1.2到18倍。

JSON部分更新

MySQL的8.0增加了對部分更新支持 JSON_REMOVE() , JSON_SET() 以及 JSON_REPLACE() 功能。如果只更新JSON文檔的某些部分,我們希望向處理程序提供有關更改內容的信息,以便存儲引擎和復制不需要編寫完整文檔。在復制環境中,無法保證JSON文檔的布局在從屬和主服務器上的布局完全相同,因此物理差異不能用於減少基於行的復制的網絡I / O. 因此,MySQL 8.0提供了邏輯差異,基於行的復制可以通過線路發送並在從屬設備上重新應用。請參閱Knut Anders Hatlenhere的博客文章。

GIS

MySQL 8.0提供地理支持。這包括空間參考系統(SRS)的元數據支持,以及SRS感知空間數據類型,空間索引和空間函數。簡而言之,MySQL 8.0可以理解地球表面的緯度和經度坐標,例如,可以在大約5000個支持的空間參考系統中的任何一個中正確計算地球表面上兩點之間的距離。

空間參考系統(SRS)

的 ST_SPATIAL_REFERENCE_SYSTEMS 信息模式視圖提供有關空間數據可用的空間參考系統的信息。該視圖基於SQL / MM(ISO / IEC 13249-3)標准。每個空間參考系統由SRID號標識。MySQL 8.0附帶了來自EPSG大地測量參數數據集的大約5000個SRID ,包括地理參考橢球和2d投影(即所有2D空間參考系統)。

SRID感知空間數據類型

空間數據類型可以使用空間參考系統定義來歸因,例如SRID 4326,如下所示: CREATE TABLE t1 (g GEOMETRY SRID 4326); SRID在這里是GEOMETRY數據類型的SQL類型修飾符。插入具有SRID屬性的列的值必須位於該SRID中。嘗試將值與其他SRID一起插入會導致引發異常情況。未修改的類型(即沒有SRID規范的類型)將繼續像以前一樣接受所有SRID。

MySQL 8.0添加了INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNS SQL / MM第3部分Sect中指定視圖。19.2。這種觀點將列出所有幾何列在MySQL實例,並為每列將列出標准 SRS_NAME ,SRS_ID 和 GEOMETRY_TYPE_NAME 。

SRID感知空間索引

可以在空間數據類型上創建空間索引。空間索引中的列必須聲明為NOT NULL。例如這樣:CREATE TABLE t1 (g GEOMETRY SRID 4326 NOT NULL, SPATIAL INDEX(g));

具有空間索引的列應具有SRID類型修飾符,以允許優化程序使用索引。如果在沒有SRID類型修飾符的列上創建空間索引,則會發出警告。

SRID感知空間功能

MySQL 8.0擴展了空間函數,例如 ST_Distance() 和 ST_Length() 檢測其參數是否在地理(橢圓體)SRS中並計算橢球上的距離。到目前為止, ST_Distance 和空間關系,例如 ST_Within, ST_Intersects , ST_Contains , ST_Crosses ,等支持地理計算。每個ST函數的行為如SQL / MM第3部分Spatial中所定義。

字符集

MySQL 8.0使 UTF8MB4 成為默認字符集。SQL性能 - 例如排序UTF8MB4字符串 - 與5.7相比,在8.0中提高了20倍。UTF8MB4是網絡的主要字符編碼,這一舉措將使絕大多數MySQL用戶的生活更輕松。

  • 默認字符集已更改為 latin1 , utf8mb4 並且默認排序規則已更改 latin1_swedish_ci 為utf8mb4_800_ci_ai 。
  • 默認值的更改適用於libmysql和服務器命令工具以及服務器本身。
  • 這些更改也反映在MTR測試中,使用新的默認字符集運行。
  • 整理權重和案例映射基於 Unicode委員會於2016年6月21日宣布的Unicode 9.0.0
  • 可用於latin1(MySQL遺留)的21種語言特定的不區分大小寫的排序規則已用於  utf8mb4 排序規則,例如捷克排序規則變為utf8mb4_cs_800_ai_ci。請參閱WL#9108中的完整列表 查看Xing Zhanghere的博客文章。
  • 添加了對大小寫和重音敏感排序規則的支持。MySQL 8.0支持由DUCET(默認Unicode歸類條目表)定義的所有3級歸類權重。查看Xing Zhanghere的博客文章。
  • 日語 utf8mb4_ja_0900_as_cs 整理,utf8mb4 使用三個級別的權重字符進行 排序。這為日語提供了正確的排序順序。查看Xing Zhanghere的博客文章。
  • 日語具有額外的假名敏感功能, utf8mb4_ja_0900_as_cs_ks 其中'ks'代表'假名敏感'。查看Xing Zhanghere的博客文章。
  • 將所有新的排序規則從Unicode 9.0.0向前更改為, NO PAD 而不是 PAD STRING 像對任何其他字符一樣處理字符串末尾的空格。這樣做是為了提高一致性和性能。舊的整理留在原地。

另請參閱Bernt Marius Johnsenhere撰寫的博客文章。

數據類型

二進制數據類型的逐位操作

MySQL 8.0擴展了逐位操作('按位AND'等)也可以使用 [VAR]BINARY/[TINY|MEDIUM|LONG]BLOB在8.0位之前,只支持整數操作。如果對二進制文件使用逐BIGINT 位操作,則在操作之前將參數隱式轉換為 (64位),因此可能丟失位。從8.0開始,逐位運算對所有 數據類型BINARY 和BLOB數據類型都起作用, 從而使得參數不會丟失。

IPV6操縱

MySQL 8.0通過支持BINARY數據類型的逐位操作,提高了IPv6操作的可用性。在MySQL 5.6我們介紹了 INET6_ATON() 和 INET6_NTOA() 其將文本形式等之間的IPv6地址的功能'fe80::226:b9ff:fe77:eb17' 和 VARBINARY(16) 。但是,到目前為止,我們無法將這些IPv6功能與逐位操作結合起來,因為這樣的操作會錯誤地將輸出轉換為 BIGINT 。例如,如果我們有一個IPv6地址並希望針對網絡掩碼進行測試,我們現在可以使用 

INET6_ATON(地址
 &INET6_ATON(網絡

因為 INET6_ATON() 正確返回 VARBINARY(16) 數據類型(128位)。請參閱Catalin Besleagahere的博客文章。

 

UUID操縱

MySQL的8.0通過實現三個新的SQL函數提高UUID操作的易用性: UUID_TO_BIN() ,BIN_TO_UUID() ,和 IS_UUID() 。第一個從UUID格式的文本轉換為 VARBINARY(16) ,第二個從VARBINARY(16) UUID格式的文本轉換,最后一個檢查UUID格式的文本的有效性。存儲為a的UUID VARBINARY(16) 可以使用功能索引進行索引。這些函數 UUID_TO_BIN() 也 UUID_TO_BIN()可以隨機抽取時間相關的位並在開始時將它們移動,使其索引友好並避免B樹中的隨機插入,這樣可以減少插入時間。已經提到缺少這種功能 是使用UUID的缺點之一 。請參閱Catalin Besleagahere的博客文章。

成本模型

查詢優化器將數據緩沖考慮在內

MySQL 8.0根據有關數據是駐留在內存還是磁盤上的知識選擇查詢計划。這是自動發生的,從最終用戶看,沒有涉及配置。從歷史上看,MySQL成本模型假設數據駐留在旋轉磁盤上。與在內存中和磁盤上查找數據相關聯的成本常數現在是不同的,因此,優化器將基於對數據位置的了解為這兩種情況選擇更優化的訪問方法。請參閱ØysteinGrøvlenhere的博客文章。

優化器直方圖

MySQL 8.0實現了直方圖統計。使用直方圖,用戶可以創建表中列的數據分布統計信息,通常用於非索引列,然后查詢優化器將使用它來查找最佳查詢計划。直方圖統計的主要用例是計算“COLUMN operator CONSTANT”形式的謂詞的選擇性(過濾效果)。

用戶通過ANALYZE TABLE 語法創建直方圖,該 語法已被擴展為接受兩個新子句: UPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS] 和 DROP HISTOGRAM ON column [, column]存儲桶的數量是可選的,默認值為100.直方圖統計數據存儲在字典表“column_statistics”中,可通過視圖訪問 information_schema.COLUMN_STATISTICS 。由於JSON數據類型的靈活性,直方圖存儲為JSON對象。 ANALYZE TABLE 將根據表大小自動決定是否對基表進行采樣。它還將 根據數據分布和指定的桶數決定是構建 單例 還是 等高直方圖。請參閱ErikFrøsethhere的博客文章。

常用表達

MySQL的8.0支持UTF8MB4正則表達式,以及像新的功能 REGEXP_INSTR() , REGEXP_LIKE(), REGEXP_REPLACE() ,和 REGEXP_SUBSTR() 。添加了系統變量 regexp_stack_limit (默認為32步)和 regexp_time_limit (默認 8000000 字節)以控制執行。該 REGEXP_REPLACE() 功能是MySQL社區最需要的功能之一,例如,請參閱 Hans Ginzel 報告為BUG#27389功能請求 另見Martin Hanssonhere和Bernt Marius Johnsenhere的博客文章。

Dev Ops功能

Dev Ops關注數據庫的操作方面,通常涉及可靠性,可用性,性能,安全性,可觀察性和可管理性。高可用性隨MySQL InnoDB Cluster和MySQL Group Replication一起提供,這將由一篇單獨的博客文章介紹。以下是8.0對其他類別的表格所帶來的內容。

可靠性

MySQL 8.0提高了MySQL的整體可靠性,因為:

  1. MySQL 8.0將其元數據存儲到InnoDB中,這是一個經過驗證的事務存儲引擎。系統表(如用戶和權限以及數據字典表)現在位於InnoDB中。
  2. MySQL 8.0消除了潛在不一致的一個來源。在5.7及更早版本中,基本上有兩個數據字典,一個用於服務器層,另一個用於InnoDB層,這些字典在某些崩潰情況下可能不同步。在8.0中只有一個數據字典。
  3. MySQL 8.0確保原子,崩潰安全的DDL。有了這個,用戶可以保證任何DDL語句都可以完全執行或根本不執行。這在復制環境中尤其重要,否則可能存在主設備和從設備(節點)不同步,導致數據漂移的情況。

這項工作是在新的事務數據字典的上下文中完成的。查看Staale Deraashere andhere的博客文章。

觀測

信息架構(加速)

MySQL 8.0重新實現信息架構。在新實現中,信息模式表是存儲在InnoDB中的數據字典表的簡單視圖。這比舊的實現效率更高,速度提高了100倍。這使得信息模式實際上可以通過外部工具使用。查看Gopal Shankarhere andhere的博客文章和StåleDeraashere的博客文章。

性能架構(加速)

MySQL 8.0通過在性能模式表上添加100多個索引來加速性能模式查詢。性能模式表的索引是預定義的。它們不能被刪除,添加或更改。性能模式索引實現為跨現有表數據的過濾掃描,而不是通過單獨數據結構的遍歷。沒有要構建,更新或以其他方式管理的B樹或哈希表。性能模式表索引的行為類似於散列索引,其中a)它們快速檢索所需的行,b)不提供行排序,讓服務器在必要時對結果集進行排序。但是,根據查詢,索引會消除對全表掃描的需要,並返回相當小的結果集。性能模式索引是可見的 SHOW INDEXES 並在 EXPLAIN 輸出中表示引用索引列的查詢。來自Simon Mudd的評論。請參閱Marc Alffhere的博客文章。

配置變量

MySQL 8.0添加了有關配置變量的有用信息,例如變量名稱, 最小值/最大值 , 當前值來自何處,   進行了更改以及何時進行更改 此信息位於名為的新性能模式表中  variables_info 。請參閱Satish Bharathyhere的博客文章。

客戶端錯誤報告 - 消息計數

MySQL 8.0可以查看 服務器報告的客戶端錯誤消息的聚合計數 用戶可以查看來自5個不同表的統計信息:全局計數,每個線程的摘要,每個用戶的摘要,每個主機的摘要或每個帳戶的摘要。對於每個錯誤消息,用戶可以看到引發的錯誤數,SQL異常處理程序處理的錯誤數,“第一次看到”時間戳和“上次看到”時間戳。給定權限,用戶可以 SELECT 從這些表 TRUNCATE 中重置統計信息。請參閱Mayank Prasadhere的博客文章。

聲明延遲直方圖

MySQL 8.0提供語句延遲的性能模式直方圖,以便更好地查看查詢響應時間。這項工作還從收集的直方圖計算“P95”,“P99”和“P999”百分位數。這些百分位數可用作服務質量的指標。見弗雷德里克DESCAMPS博客文章 在這里 。

數據鎖定依賴關系圖

MySQL 8.0儀器數據鎖定在性能模式中。當事務A鎖定行R,並且事務B在同一行上等待時,B被A有效阻止。添加的檢測暴露哪些數據被鎖定(R),誰擁有鎖(A),誰在等待對於數據(B)。見弗雷德里克DESCAMPS博客文章 在這里 。

摘要查詢示例

MySQL 8.0對events_statements_summary_by_digest 性能模式表進行了一些更改, 以捕獲完整的示例查詢以及有關此查詢示例的一些關鍵信息。QUERY_SAMPLE_TEXT 添加該列 以捕獲查詢示例,以便用戶可以在實際查詢上運行EXPLAIN並獲取查詢計划。QUERY_SAMPLE_SEEN 添加該列 以捕獲查詢示例時間戳。QUERY_SAMPLE_TIMER_WAIT 添加該列 以捕獲查詢示例執行時間。FIRST_SEEN 和 LAST_SEEN 已被修改為使用小數秒。見弗雷德里克DESCAMPS博客文章  在這里

關於儀器的元數據

MySQL 8.0將性能 , 易變性 和 文檔等元數據添加 到性能模式表  setup_instruments中 。這種只讀元數據充當儀器的在線文檔,供用戶或工具查看。見弗雷德里克DESCAMPS博客文章 在這里 。

錯誤記錄

MySQL 8.0對MySQL 錯誤日志進行了重大改進 從軟件體系結構的角度來看,錯誤日志是新服務基礎結構中的一個組件。這意味着高級用戶可以根據需要編寫自己的錯誤日志實現。大多數用戶不希望編寫自己的錯誤日志實現,但仍希望在編寫內容和編寫內容時有一定的靈活性。因此,8.0為用戶提供了添加 接收器(在哪里) 和 過濾器(什么)的功能 。MySQL 8.0實現了過濾服務(API)和默認過濾服務實現(組件)。此處的過濾意味着禁止給定日志消息(投影)中的某些日志消息(選擇)和/或字段。MySQL 8.0實現了日志編寫器服務(API)和默認的日志編寫器服務實現(組件)。日志編寫器接受日志事件並將其寫入日志。此日志可以是經典文件,syslog,EventLog和新的JSON日志編寫器。

默認情況下,在沒有任何配置的情況下,MySQL 8.0提供了許多開箱即用的錯誤日志改進,例如:

  • 錯誤編號: 格式是10000系列中以“MY-”開頭的數字,例如“MY-10001”。錯誤編號在GA版本中將保持穩定,但允許在維護版本中更改(即改進)相應的錯誤文本。
  • 系統消息: 系統消息作為[系統]而不是[錯誤],[警告],[注意]寫入錯誤日志。無論詳細程度如何,都會打印[系統]和[錯誤]消息,無法抑制。[系統]消息僅在少數地方使用,主要與主要狀態轉換相關,例如啟動或停止服務器。
  • 減少詳細程度:log_error_verbosity 的缺省值 從3(注釋)更改為2(警告)。這使MySQL 8.0錯誤日志默認情況下更簡潔。
  • 源組件: 每條消息都注釋三個值[Server],[InnoDB],[Replic]中的一個,顯示消息來自哪個子系統。

這是在啟動后寫入8.0 GA中的錯誤日志的內容:

2018-03-08T101429.289863 ž 0 [系統] [MY- 010116 ] [服務器] / usr / sbin目錄/ mysqld的(mysqld的8.05)開始作為過程8063 2018 -03-08T101429.745356 ž 0 [警告] [ MY-010068 ] [服務器] CA證書ca.pem是自簽名的。 2018 -03-08T101429.765159 Z 0 [系統] [ MY-010931 ] [服務器] / usr / sbin / mysqld:准備連接。版本'8.0.5'   套接字'/ tmp / mysql.sock'   端口3306   源分發。 2018 -03-08T101651.343979 ž 0 [系統] [MY- 010910 ] [服務器] / usr / sbin目錄/ mysqld的:關機完成(mysqld的8.05)來源的分布。 

在錯誤日志中引入錯誤編號允許MySQL在即將到來的維護版本(如果需要)中改進錯誤文本,同時保持錯誤編號(ID)不變。錯誤號也可作為過濾/抑制和國際化/本地化的基礎。

可管理性

不可見的索引

MySQL 8.0增加了切換索引可見性(可見/不可見)的功能。優化程序在進行查詢執行計划時不會考慮不可見索引。但是,索引仍然保留在后台,因此再次顯示它很便宜。這樣做的目的是讓DBA / DevOp確定是否可以刪除索引。如果您懷疑某個索引未被使用,則首先使其不可見,然后監視查詢性能,最后在沒有遇到查詢減慢的情況下刪除索引。許多用戶已經要求使用此功能,例如通過 Bug#70299 。請參閱Martin Hanssonhere的博客文章。

靈活撤銷表空間管理

MySQL 8.0使用戶可以完全控制撤消表空間,即有 多少 表空間, 它們放在哪里,以及 每個表空間 有 多少個回滾段

  1. 不再在系統表空間中撤消登錄。 在升級期間,撤消日志將從System表空間遷移到Undo表空間。這為使用系統表空間的撤消日志提供了現有5.7安裝的升級路徑。
  2. 撤消表空間可以與System表空間分開管理。 例如,撤消表空間可以放在快速存儲上。
  3. 回收非常大的交易所占用的空間(在線)。 至少創建兩個Undo表空間以允許表空間截斷。這允許InnoDB縮小撤消表空間,因為一個撤消表空間可以是活動的而另一個是截斷的。
  4. 更多回滾段可以減少爭用。 用戶可能選擇最多127個撤消表空間,每個表空間最多包含128個回滾段。更多回滾段意味着並發事務更有可能為其撤消日志使用單獨的回滾段,從而減少對相同資源的爭用。

請參閱Kevin Lewishere的博客文章。

全局變量的SET PERSIST

MySQL 8.0可以持久保存全局動態服務器變量。許多服務器變量都是GLOBAL和DYNAMIC,可以在服務器運行時重新配置。例如: SET GLOBAL sql_mode='STRICT_TRANS_TABLES'; 但是,重新啟動服務器時會丟失此類設置。

這項工作使得編寫成為可能 SET PERSIST sql_mode='STRICT_TRANS_TABLES'; 。效果是設置將在服務器重啟后繼續存在。此功能有許多使用方案,但最重要的是,它提供了一種在編輯配置文件時管理服務器設置的方法不方便或不是一個選項。例如,在某些托管環境中,您沒有文件系統訪問權限,您擁有的只是連接到一個或多個服務器的能力。至於 SET GLOBAL 你需要超級特權 SET PERSIST 。

還有 RESET PERSIST 命令。該 RESET PERSIST 命令具有從persist配置中刪除配置變量的語義,從而將其轉換為具有類似的行為 SET GLOBAL 。

MySQL 8.0允許 SET PERSIST 設置大多數只讀變量,新值將在下次服務器重啟時生效。請注意,有意無法設置一小部分只讀變量。請參閱Satish Bharathyhere的博客文章。

遠程管理

MySQL 8.0實現了一個SQL RESTART命令。目的是通過SQL連接啟用MySQL服務器的遠程管理,例如通過SET PERSIST 后跟a 來設置非動態配置變量 RESTART 。請參閱博客文章  MySQL 8.0:輕松更改配置和雲友好! 作者FrédéricDescamps。

重命名表空間(SQL DDL)

MySQL 8.0實現 ALTER TABLESPACE s1 RENAME TO s2; 共享/通用表空間是用戶可見的實體,用戶可以使用CREATE,ALTER和DROP。另請參閱 Bug#26949 , Bug#32497 和 Bug#58006

重命名列(SQL DDL)

MySQL 8.0實現 ALTER TABLE ... RENAME COLUMN old_name TO new_name; 這是對現有語法ALTER TABLE <table_name> CHANGE ...的改進,它需要重新指定列的所有屬性。舊/現有語法的缺點是,嘗試進行重命名的應用程序可能無法使用所有列信息。舊/現有語法中存在意外數據類型更改的風險,這可能導致數據丟失。

安全功能

新的默認身份驗證插件

MySQL 8.0將默認的身份驗證插件從 mysql_native_password更改 為caching_sha2_password 。相應地,libmysqlclient也將使用caching_sha2_password作為默認的身份驗證機制。新的caching_sha2_password結合了更好的安全性(SHA2算法)和高性能(緩存)。總體方向是我們建議所有用戶使用TLS / SSL進行所有網絡通信。請參閱Harin Vadodariahere的博客文章。

社區版中的默認OpenSSL

MySQL 8.0統一在 OpenSSL上 作為MySQL企業版和MySQL社區版的默認TLS / SSL庫。以前,MySQL Community Edition使用 YaSSL 。在MySQL社區版中支持OpenSSL一直是最常請求的功能之一。請參閱FrédéricDescampshere的博客文章。

OpenSSL是動態鏈接的

MySQL 8.0與OpenSSL動態鏈接。從 MySQL Repository 用戶的角度來看,MySQL軟件包依賴於Linux系統提供的OpenSSL文件。通過動態鏈接,可以在可用時應用OpenSSL更新,而無需MySQL升級或修補程序。請參閱FrédéricDescampshere的博客文章。

撤消和重做日志的加密

MySQL 8.0實現UNDO和REDO日志的數據靜態加密。在5.7中,我們 為存儲在每個表文件表空間中的InnoDB表引入了 表空間加密此功能為物理表空間數據文件提供靜態加密。在8.0中,我們將其擴展為包括UNDO和REDO日志。見文檔 這里 。

SQL角色

MySQL 8.0實現了SQL角色。角色是命名的特權集合。目的是簡化用戶訪問權限管理。可以向用戶授予角色,為角色授予權限,創建角色,刪除角色以及確定在會話期間適用的角色。見弗雷德里克DESCAMPS博客文章 在這里 。

允許PUBLIC的授權和撤銷

MySQL 8.0引入了配置變量 ,可用於 在創建新用戶時自動分配和授予 默認角色示例: 始終將所有指定的角色視為已授予每個用戶,並且無法撤消這些角色。除非將這些角色設為默認角色,否則這些角色仍需要激活。當新服務器配置變量 設置為“ON”時,在用戶進行身份驗證后,始終會激活所有授予的角色。 mandatory-roles role1@%,role2,role3,role4@localhostactivate-all-roles-on-login

打破超級特權

MySQL 8.0為以前版本中SUPER的各個方面定義了一組新的細化權限。目的是限制用戶對手頭工作所需內容的訪問權限,僅此而已。例如 BINLOG_ADMIN , CONNECTION_ADMIN 和ROLE_ADMIN 。

管理XA事務的授權模型

MySQL 8.0引入了一個新的系統特權 XA_RECOVER_ADMIN ,它控制着執行語句的能力 XA RECOVER 。XA RECOVER 未被授予新系統特權的用戶嘗試執行 此操作 XA_RECOVER_ADMIN 將導致錯誤。

密碼輪換政策

MySQL 8.0引入了對密碼重用的限制。可以在全局級別以及單個用戶級別配置限制。密碼歷史記錄保持安全,因為它可以提供有關個人用戶更改密碼時使用的習慣或模式的線索。該 密碼輪換政策 來除了其他現有機制,如 密碼過期策略 和 允許的密碼策略 。請參閱 密碼管理 。

減慢對用戶密碼的暴力攻擊

MySQL 8.0基於連續不成功的登錄嘗試在認證過程中引入了延遲。目的是減緩對用戶密碼的暴力攻擊。可以在引入延遲之前配置連續不成功嘗試的次數以及引入的最大延遲量。

退出skip-grant-tables

啟動服務器時,MySQL 8.0不允許遠程連接 –skip-grant-tables 。另見 Omar Bourja報告的Bug# 79027。

將mysqld_safe功能添加到服務器

MySQL 8.0實現了當前在mysqld_safe 服務器內部腳本中找到的邏輯部分 在某些情況下,這項工作可以提高服務器的可用性,例如在使用 --daemonize 啟動選項時。這項工作也使用戶減少對mysqld_safe script 我們的依賴 ,我們希望將來可以刪除。它還修復 了Peter Laursen報道的Bug#75343

性能

MySQL 8.0具有更好的讀/寫工作負載,IO綁定工作負載和高爭用“熱點”工作負載的性能。此外,新的資源組功能通過將用戶線程映射到CPU,為用戶提供了針對特定硬件上的特定工作負載進行優化的選項。

擴展讀/寫工作量

MySQL 8.0可以很好地擴展RW和繁重的寫入工作負載。在密集的RW工作負載上,我們觀察到4個並發用戶已經獲得了更好的性能,並且與MySQL 5.7相比,在高負載上性能提高了2倍以上。我們可以說,雖然5.7顯着提高了只讀工作負載的可擴展性,但8.0顯着提高了讀/寫工作負載的可擴展性。結果是MySQL提高了標准服務器端硬件(如帶有2個CPU插槽的系統)的硬件利用率(效率)。這種改進是由於重新設計InnoDB如何寫入REDO日志。與用戶線程不斷爭取記錄其數據更改的歷史實現相反,在新的REDO日志解決方案中,用戶線程現在是無鎖的,REDO寫入和刷新由專用后台線程管理,整個REDO處理變為事件驅動。請參閱Dimitri Kravtchuk的博客文章 在這里 。

利用IO容量(快速存儲)

MySQL 8.0允許用戶充分利用每個存儲設備。例如,使用Intel Optane閃存設備進行測試,我們能夠在完全IO綁定的工作負載中超過1M Point-Select QPS。(IO綁定意味着數據不緩存在緩沖池中,但必須從輔助存儲中檢索)。這種改進是由於擺脫了   fil_system_mutex  全球鎖定。

高爭用負載時的更好性能(“熱行”)

MySQL 8.0顯着提高了高爭用工作負載的性能。當多個事務正在等待表中同一行的鎖定時,會發生高爭用工作負載,從而導致等待事務的隊列。許多現實世界的工作負載不是平穩的,例如一天,但可能在某些時間爆發( 帕累托分布 )。MySQL 8.0在每秒事務數,平均延遲和第95百分位延遲方面都能更好地處理此類突發事件。最終用戶的好處是更好的硬件利用率(效率),因為系統需要更少的備用容量,因此可以以更高的平均負載運行。最初的補丁由Jiamin Huang( Bug#84266 )提供。請研究一下 爭用意識事務調度 (CATS)算法,閱讀賈民明和Sunny Bainshere的MySQL博客文章。

資源組

MySQL 8.0將全局資源組引入MySQL。使用資源組,DevOps / DBA可以管理用戶/系統線程和CPU之間的映射。這可用於在CPU之間拆分工作負載,以在某些用例中獲得更高的效率和/或性能。因此,資源組向DBA工具箱添加了一個工具,該工具可以幫助DBA提高硬件利用率或提高查詢穩定性。例如,在Intel(R)Xeon(R)CPU E7-4860 2.27 GHz 40內核-HT盒上運行Sysbench RW工作負載時,我們通過將寫入負載限制為10個內核,使總吞吐量翻了一番。資源組是一種相當先進的工具,需要有效使用熟練的DevOps / DBA,因為效果會隨着負載類型和手頭的硬件而變化。

其他特性

更好的默認值

在MySQL團隊中,我們密切關注MySQL的默認配置,並旨在讓用戶盡可能獲得最佳的開箱即用體驗。MySQL 8.0已將超過30個默認值更改為我們認為更好的值。請參閱MySQL 8.0中的博客文章 New Defaults 。Mogan Tockerhere在博客文章中概述了這一動機。

協議

MySQL 8.0添加了一個關閉結果集的元數據生成和傳輸的選項。構造/解析和發送/接收結果集元數據消耗服務器,客戶端和網絡資源。在某些情況下,元數據大小可能比實際結果數據大小大得多,並且不需要元數據。通過完全禁用這些數據的生成和存儲,我們可以顯着加快查詢結果傳輸速度。CLIENT_OPTIONAL_RESULTSET_METADATA 如果客戶端不希望元數據返回結果集,則客戶端可以設置該 標志。

C客戶端API

MySQL 8.0擴展了libmysql的C API,其中包含一個穩定的接口,用於從服務器獲取作為數據包流的復制事件。目的是避免調用未記錄的API和打包內部頭文件,以實現基於binlog的程序,如MySQL Applier for Hadoop。

Memcached的

MySQL 8.0通過多個get 操作和范圍查詢支持 增強了InnoDB Memcached功能 我們添加了對多重獲取 操作的支持, 以進一步提高讀取性能,即用戶可以在單個memcached查詢中獲取多個鍵值對。 Yoshinori @ Facebook已經要求支持 范圍查詢使用范圍查詢,用戶可以指定特定范圍,並獲取此范圍內的所有限定值。這兩個功能都可以顯着減少客戶端和服務器之間的往返次數。

持久性自動計數器

MySQL 8.0 AUTOINC 通過計數器寫入重做日志來保留 計數器。這是對舊版Bug#199的修復MySQL恢復過程將重播重做日志並確保AUTOINC 計數器的正確值 不會有任何AUTOINC 計數器回滾 這意味着數據庫恢復將在崩潰后重新建立最后的已知計數器值。它保證 AUTOINC 計數器不能兩次獲得相同的值。計數器單調遞增,但請注意可能存在間隙(未使用的值)。缺乏持久性AUTOINC 在過去被認為是麻煩的,例如參見 Stephen Dewey在2006年報道的Bug#21641或 這篇 博文。

摘要

如上所示,MySQL 8.0帶有大量新功能和性能改進。dev.mysql.com下載 並試用!

您還可以  現有的MySQL 5.7 升級到MySQL 8.0。在此過程中,您可能需要嘗試新的MySQL Shell(mysqlsh)附帶的newUpgrade Checker。此實用程序將分析您現有的5.7服務器並告訴您可能的8.0不兼容性。另一個很好的資源是博客文章 遷移到MySQL 8.0而不會破壞FrédéricDescamps的舊應用程序

在這篇博文中,我們介紹了服務器功能。還有更多!我們還將發布其他功能的博客文章,例如復制,組復制,InnoDB群集,文檔存儲,MySQL Shell,DevAPI和連接器。

這就是現在, 感謝您 使用 MySQL !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM