1. 程式人生 > >mysql與Json學習總結

mysql與Json學習總結

mysql在5.7以後InnoDB儲存引擎已經開始對json資料進行支援,對json支援有如下優勢:

  • JSON資料有效性檢查:BLOB型別無法在資料庫層做這樣的約束性檢查,如不合法會報錯:
  • 查詢效能的提升:查詢不需要遍歷所有字串才能找到資料
  • 支援索引:通過虛擬列的功能可以對JSON中的部分資料進行索引

建表語句:

CREATE TABLE `employe` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(18) DEFAULT NULL,
  `sex` int DEFAULT NULL,
  `others` json 
DEFAULT NULL, `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '錄入時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=42334 DEFAULT CHARSET=utf8mb4;

 

  

其中支援json的主要函式如下表:或見https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

 簡單列一下常用操作,便於記憶:

  •  JSON_EXTRACT(column_name,'$.name')返回該json列column中的name中的值
  • JSON_SEARCH(others, 'one', "露露")   若該欄位存在,返回路徑,若不存在返回null:select * from employe where JSON_SEARCH(others, 'one', "露露") is not null;//查詢存在“露露”的記錄;該方法中的中間引數有“one”與“all”兩種,one返回該json中第一次找到的記錄路徑,all返回該json中所有找到的路徑,即若存在多個“露露”則返回多個露露的路徑
  • JSON_TYPE(others) 判斷alias的json型別(ARRAY或者OBJECT)
  • JSON_VALID(others) 判斷alias 是否是一個合法的json

 

虛擬列:虛擬列類似於檢視,將others欄位中的address提取出來作為一個虛擬列address,當others欄位中的address發生改變時,虛擬列會同時改變。

ALTER TABLE employe ADD address varchar(128) GENERATED ALWAYS AS (json_extract(others,'$.address')) VIRTUAL;

若去掉address列的引號可用replace替換:

ALTER TABLE employe ADD address varchar(128) GENERATED ALWAYS AS (REPLACE(json_extract(others,'$.address'),"\"",'')) VIRTUAL;

可對該虛擬欄位進行查詢:

select * from employe where address="北京昌平";

 在MySQL 5.7中,支援兩種generated column,即virtual generated column和stored generated column,前者只將generated column儲存在資料字典中(表的元資料),並不會將這一列資料持久化到磁碟上;後者會將generated column持久化到磁碟上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以通過已有資料計算而得的資料,需要更多的磁碟空間,與virtual column相比並沒有優勢,因此,MySQL 5.7中,不指定generated column的型別,預設是virtual column。

 

 虛擬索引:虛擬列與普通列類似可建立索引,虛擬索引列也是通過傳統的B+樹索引即可實現對JSON格式部分屬性的快速查詢。使用方法是首先建立該虛擬列,然後在該虛擬列上建立索引:

alter table employe add INDEX add_index(address);

 在建立索引後執行語句select * from employe where address="北京昌平";如下圖,發現使用到了索引: 

 

效率問題:關於效率方面,使用json報錯或將json轉化為多表儲存的效率對比參考https://www.cnblogs.com/lkpnotice/p/6903187.html