mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis
背景:現有業務擴展字段,都存在feature字段,存在語義不清晰以及,難以利用索引查詢問題
Mysql 5.7后推出利器,JSON+虛擬列,即實現了業務語義統一,也支持索引查詢加速
一、簡單描述
MySQL 5.7.7 labs版本開始InnoDB存儲引擎已經原生支持JSON格式,該格式不是簡單的BLOB類似的替換。原生的JSON格式支持有以下的優勢:
JSON數據有效性檢查:BLOB類型無法在數據庫層做這樣的約束性檢查
查詢性能的提升:查詢不需要遍歷所有字符串才能找到數據
支持索引:通過虛擬列的功能可以對JSON中的部分數據進行索引
二、MYSQL JSON 函數支持
三、MYBATIS 動態支持擴展+JSON查詢
Mybatis查詢
open="" separator="AND" close="">
and JSON_UNQUOTE(extended_fields->'$.${key}')= #{item}
]]>
MAP參數傳入
DB 數據存儲,格式JSON
四、虛擬列
除了mysql5.7對json特性支持以外,另一個讓人振奮人心的莫過于新增了虛擬列的這樣一個東西。顧名思義,virtual column就是一個虛擬列,在MySQL 5.7中,支持兩種generated column,即virtual generated column和stored generated column,前者只將generated column保存在數據字典中(表的元數據),并不會將這一列數據持久化到磁盤上;后者會將generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,后者存放了可以通過已有數據計算而得的數據,需要更多的磁盤空間,與virtual column相比并沒有優勢,因此,MySQL 5.7中,不指定generated column的類型,默認是virtual column。此外
stored generated column性能較差
如果需要stored generated column的話,可能在generated column上建立索引更加合適 知道了什么是虛擬列,那么虛擬索引列當然是虛擬列加上索引嘍!當然了,虛擬索引列也是通過傳統的B+樹索引即可實現對JSON格式部分屬性的快速查詢。使用方法是首先創建該虛擬列,然后在該虛擬列上創建索引:
ALTER TABLE ding_ding ADD virtualAppId int GENERATED ALWAYS AS (json_extract(instValue,'$.appId')) VIRTUAL;
ALTER TABLE ding_ding ADD index index_virtual_appId (virtualAppId);
下面看一下官方文檔對virtual和stored解釋:
VIRTUAL : Column values are not stored, but are evaluated when rows are read, immediately after any BEFORE triggers. 列值不存儲,而是被讀取行時進行評估,之后立即用 BEFORE觸發器。虛擬列不帶存儲。
STORED : Column values are evaluated and stored when rows are inserted or updated. 列值進行評估,并行被插入或更新時存儲。存放的列確實需要的存儲空間,并可以被索引。 > 友情提示: > - 在MySQL 5.7.8之前,虛擬列不能建立索引。在MySQL 5.7.8,InnoDB的支持在虛擬列輔助索引 > - json類型字段不支持直接索引 > - 虛擬索引列只支持二級索引,其它的索引類型不支持 > - 虛擬索引列不能被當做一個外鍵來使用 > - 添加或在虛擬列刪除一個輔助索引是就地操作。 Adding or dropping a secondary index on a virtual column is an in-place operation.
總結
以上是生活随笔為你收集整理的mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面部按摩方法
- 下一篇: 如何手动连上mysql_如何手动安装My