10 個開發者必知的 MySQL 8.0 新功能

Summer__發表於2019-09-03

10 個開發者必知的 MySQL 8.0 新功能

文章轉發自專業的Laravel開發者社群,原始連結:learnku.com/laravel/t/1…

下面將以 MySQL 社群的優先順序從高到低來展示這些功能:

TOP 10

  1. MySQL 文件儲存
  2. 預設 utf8mb4 編碼
  3. JSON 增強
  4. CTEs(譯者注:Common Table Expresssions 公共表格表示式)
  5. 視窗函式
  6. 降序索引
  7. 更好的優化器消費模型
  8. MySQL 伺服器元件
  9. GIS(譯者注:Geographic Information System 地理資訊系統) 提升
  10. InnoDB 引擎的 NO WAIT 和 SKIP \ LOCKED 選項

1. MySQL 文件儲存

這是 MySQL 8.0 中最受期待和最受歡迎的特性 ... 同時他非常容易理解。

我對 MySQL 文件儲存非常興奮,我在全球各地展示他快一年的時間,並收到了很多好的反饋。 為什麼 MySQL DS 如此優秀? 因為使用一種解決方案你可以處理 SQL 和 NoSQL。你也可以將兩種語言的優勢結合起來。 你可以對相同資料執行 CRUD 命令,同時你也可以在 SQL 中執行如連線多個表及 and/or 集合這種更復雜的查詢。

同時後端是眾所周知強大的 InnoDB 引擎, MySQL 文件儲存引擎完全符合 ACID 標準。 因為他都在 MySQL 內部,所以你可以從你熟悉的內容中收益,亦可以將其轉換到文件儲存: replication, performance_schema, ...

2. 預設字符集為 utf8mb4

使用 MySQL 8.0, 我們當然關注現代 Web 應用... 這是指移動端! 當我們提到手機端, 也是表情符號和大量的需要共存的字符集和歸類。

這就是為什麼我們決定將預設的字符集從 latin-1 轉為 utf8mb4。 MySQL支援最新的 Unicode 9.0 基於 DUCET 的新分類, 重音和大小寫敏感的歸類,日語,俄語,...

3. JSON 強化

MySQL 帶來了一些新的 JSON 相關變更:

  • 新增 ->> 表示式,作用等於 JSON_UNQUOTE(JSON_EXTRACT())
  • 新的聚合函式 JSON_ARRAYAGG() 和 JSON_OBJECTAGG()
  • 新增 JSON_PRETTY()
  • 新的 JSON 工具函式如 JSON_STORAGE_SIZE()JSON_STORAGE_FREE()

MySQL 8.0 中 JSON 最重要的優化之一,是提供了一個 JSON_TABLE() 函式。此函式接受 JSON 格式的資料,然後將其轉化為關係型資料表。欄位和資料的格式都可以被指定。你也可以對 JSON_TABLE() 以後的資料使用正常的 SQL 查詢,如 JOINS, 聚合查詢等, ... 你可以查閱 @stoker 的博文 ,當然你也可以閱讀 官方文件 。

需要注意的是,這不僅僅影響到開發者的使用,MySQL 的執行效能也會受到影響。在老系統中,更新 JSON 時系統會刪除老資料並寫入新的資料,在新系統中,如果你要更新 JSON 資料裡的某個欄位,正確的做法是直接對 JSON 裡的某個欄位進行更新,這樣執行效率更佳,並且資料庫主從複製(Replication)效能也會受益。

4. 公共表格表示式 (CTEs)

MySQL 8.0 新增了 CTEs 功能(譯者注:Common Table Expresssions 公共表格表示式)。CTE 是一個命名的臨時結果集,僅在單個 SQL 語句的執行範圍記憶體在,可以是自引用,也可以在同一查詢中多次引用。

5. 統計分析方法

針對查詢中的每一行,一個統計分析方法使用該行關聯的行執行計算。 這就像 GROUP BY 方法但他是保留行而不是摺疊他們。

以下是 MySQL 8.0.4 當前實現的統計分析方法列表:

名稱 描述
CUME_DIST() 累計分配值
DENSE_RANK() 當前行在分割槽的排名, 沒有間隔
FIRST_VALUE() 視窗框架第一行的引數值
LAG() 分割槽中指定行落後於當前行的引數值
LAST_VALUE() 視窗框架第一行的引數值
LEAD() 分割槽中引導當前行的引數值
NTH_VALUE() 從第N行視窗框架的引數值
NTILE() 分割槽中當前行的桶號
PERCENT_RANK() 百分比等級值
RANK() 當前行在分割槽中的排名,含間隔
ROW_NUMBER() 其分割槽中的當前行數

6. 降序索引

在 MySQL 8.0 之前, 當在索引定義中使用 DESC 時該標誌將被忽略。 現在不再是這樣了! 現在鍵值按降序儲存。以前, 索引可能被按相反順序掃描,但效能會受到影響。可以按順序掃描倒序索引,這將更高效。

7. 更好的優化器開銷模型

新的優化器開銷模型(Optimizer Cost Model)現在會計算記憶體快取資料和硬碟資料。推薦閱讀 Øystein 的部落格文章.

8. MySQL 伺服器模組

你可以利用此特性來擴充套件 MySQL 伺服器的功能,這將會比外掛更加容易開發和維護,推薦閱讀 官方文件

9. GIS 的提升

MySQL 8.0 對 GIS(譯者注:Geographic Information System 地理資訊系統) 的支援有非常高的提升,功能上直追 PostgreSQL。

一些例子:

  • 座標軸將擁有單位
  • 地理座標系統
  • 座標軸將不會偏移
  • 座標軸支援排序
  • 座標軸支援方向相關性

10. InnoDB 引擎 NO WAIT 與 SKIP LOCKED

MySQL 8.0 的 InnoDB 引擎現在可以更好的處理熱行爭搶。 InnoDB 支援 NOWAIT 和 SKIP\ LOCKED 選項與 SELECT ... FOR\ SHARE 和 SELECT ... FOR\ UPDATE 鎖定讀取語句。 NOWAIT 會在請求行被其他事務鎖定的情況下立即返回語句。 SKIP LOCKED 從結果集中刪除被鎖定的行。 參見 使用 NOWAIT 和 SKIP LOCKED 鎖定併發讀取.

當然好的 MySQL 8.0 特性列表不會在這裡結束, 例如 支援正規表示式  也是一個剛剛出現在 [8.0.4] 版本中的有趣的特性 (mysqlserverteam.com/the-mysql-8…)。 新的 SQL GROUPING() 功能,  IPV6 和 UUID 操作新業務,更多優化器提示...

我希望這給你一個很好的概述,是什麼樣的請求在驅動 MySQL 的創新。下一篇文章將介紹應該使得開發者滿意的 MySQL 8.0 特性 ?

相關文章