MySQL8.0 新特性:Partial Update of LOB Column

MySQL8.0對json進行了比較完善的支持, 咱們知道json具備比較特殊的存儲格式,一般存在多個key value鍵值對,對於相似更新操做一般不會更新整個json列,而是某些鍵值。mysql

對於某些複雜的應用,json列的數據可能會變的很是龐大,這時候一個突出的問題是:innodb並不識別json類型,對它而言這些存儲統一都是LOB類型,而在以前的版本中Innodb處理LOB更新的方式是標記刪除舊記錄,並插入新記錄,顯然這會帶來一些存儲上的開銷(儘管Purge線程會去後臺清理),而寫入的redo log和Binlog的量也會偏高,對於超大列,可能會嚴重影響到性能。爲了解決這個問題,MySQL8.0引入了LOB列部分更新的策略。sql

官方博客有幾篇文章介紹的很是清楚,感興趣的能夠直接跳過本文,直接閱讀官方博客:json

1: partial update of json values
2: introduces lob index for faster update
3: MVCC of Large Objectsmvc

以及相關的開發worklog:ide

WL#8963: Support for partial update of JSON in the optimizer
WL#8985: InnoDB: Refactor compressed BLOB code to facilitate partial fetch/update
WL#9141: InnoDB: Refactor uncompressed BLOB code to facilitate partial fetch/update
WL#9263: InnoDB: Enable partial access of LOB using multiple zlib streams
WL#8960: InnoDB: Partial Fetch and Update of BLOB
WL#10570: Provide logical diffs for partial update of JSON values
WL#2955: RBR replication of partial JSON updates函數

本文僅僅是筆者在理解該特性時作的一些簡單的筆記,,記錄的主要目的是用於之後若是涉及到相關的工做能夠快速展開,所以比較凌亂sqlserver

目前partial update須要經過JSON_SET, 或者JSON_REPLACE等特定接口來進行json列的更新,而且不是全部的更新都可以知足條件:性能

  • 沒有增長新的元素
  • 空間足夠大,能夠容納替換的新值fetch

    • 但相似數據長度(10 =>更新成7=>更新成9)是容許的

下面以json_set更新json列爲例來看看相關的關鍵堆棧spa

檢查是否支持partial update

如上所述,須要指定的json函數接口才能進行partial update

mysql_execute_command
    |--> Sql_cmd_dml::execute
             |--> Sql_cmd_dml::prepare
                         |--> Sql_cmd_update::prepare_inner
                                     |---> prepare_partial_update
                                           |-->Item_json_func::supports_partial_update

這裏只是作預檢查,對於json列的更新若是所有是經過json_set/replace/remove進行的,則將其標記爲候選partial update的列(TABLE::mark_column_for_partial_update), 存儲在bitmap結構TABLE::m_partial_update_columns

設置partial update

相關文章
相關標籤/搜索