MySQL之Json類型


1 Json 類型簡介

MySQL 5.7 之后提供了Json類型,是MySQL 結合結構化存儲和非結構化存儲設計出來的一個類型。

在某些場景下,Json 類型簡直是福音。

場景1: 用戶畫像,描述用戶的標簽等類似場景,比如互聯網醫院類系統的患者健康檔案,有很多信息不是必填項,如:身高、體重、三圍等等信息,可以使用 Json 存儲。

場景2: 游戲類場景;

場景3: 存儲圖片等附屬信息,比如圖片的分辨率,圖片標題等。

2 讓我們看看Json怎么用的

創建表,並插入數據

CREATE TABLE UserLogin (
    userId BIGINT NOT NULL,
    loginInfo JSON,
    PRIMARY KEY(userId)
);
INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (1, '{\"QQ\": \"82946772\", \"wxchat\": \"破產碼農\", \"cellphone\": \"13918888888\"}');
INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (2, '{\"cellphone\": \"15026888888\"}');
INSERT INTO `UserLogin`(`userId`, `loginInfo`) VALUES (3, '{\"QQ\": \"82946772\", \"wxchat\": \"破產碼農\", \"cellphone\": \"13918888889\"}');

2.1 JSON_EXTRACT 函數,獲取Json字段中特定屬性的值

SELECT JSON_UNQUOTE(JSON_EXTRACT(loginInfo, "$.cellphone")) from UserLogin;

獲取cellphone屬性的值。可以使用->寫法或者->>寫法。

-- 帶引號
SELECT loginInfo->"$.cellphone" from UserLogin;
-- 不帶引號
SELECT loginInfo->>"$.cellphone" from UserLogin;

函數說明:

JSON_EXTRACT(或->)從JSON文檔返回數據。

JSON_UNQUOTE取消引用JSON值,並以utf8mb4字符串的形式返回結果。

2.2 JSON_CONTAINS 查詢Json中滿足cellphone等於13918888888的記錄

SELECT * from UserLogin where JSON_CONTAINS(loginInfo, '"13918888888"', '$.cellphone')

說明:使用 JSON_CONTAINS 搜索指定鍵的值是否與指定值匹配。

2.3 給Json中的字段添加索引

-- 增加虛擬列-cellphone,值通過loginInfo計算而來
alter table UserLogin add COLUMN cellphone varchar(50) as (loginInfo->>"$.cellphone");
-- 給cellphone 這一列增加唯一索引
alter table UserLogin add unique index idex_cellphone(cellphone);

可以看到的確使用了該索引進行查詢

2.4 JSON_CONTAINS_PATH 判斷Json中是否有對應字段

所有記錄中有多少記錄包含wxchat字段

SELECT count(*), JSON_CONTAINS_PATH(loginInfo, 'one', '$.wxchat') cp FROM UserLogin GROUP BY cp

返回

說明,包含wxchat字段有兩條記錄,不包含的有一條記錄。

2.5 JSON_PRETTY 讓Json長的更好看

SELECT JSON_PRETTY(loginInfo) from UserLogin 

可以返回格式化的json數據

{
  "QQ": "82946772",
  "wxchat": "破產碼農",
  "cellphone": "13918888888"
}

2.6 JSON_STORAGE_SIZE返回二進制表示的字節數

返回loginInfo字段中存儲的二進制表示的字節數。

SELECT max(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;
SELECT avg(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;
SELECT min(JSON_STORAGE_SIZE(loginInfo)) FROM UserLogin;

2.7 其他函數

  • JSON_OBJECT 計算鍵值對列表並返回包含這些鍵值對的JSON對象,使用JSON_OBJECT。
  • JSON_OBJECTAGG 接受兩個列名或表達式,並返回一個包含JSON_OBJECTAGG鍵值對的JSON對象。
  • JSON_ARRAY 計算一個值列表,並使用JSON_ARRAY返回包含這些值的JSON數組。
  • JSON_ARRAYAGG 將結果集聚合為單個JSON數組,其元素由帶有JSON_ARRAYAGG的行組成。
  • JSON_TABLE 從JSON文檔中提取數據,並將其作為具有JSON_TABLE指定列的關系表返回。

總結

JSON 類型是 MySQL 5.7 版本新增的數據類型,用好 JSON 數據類型可以有效解決很多業務中實際問題。最后,我總結下今天的重點內容: 使用 JSON 數據類型,推薦用 MySQL 8.0.17 以上的版本,性能更好,同時也支持 Multi-Valued Indexes;

  • JSON 數據類型的好處是無須預先定義列,數據本身就具有很好的描述性;

  • 不要將有明顯關系型的數據用 JSON 存儲,如用戶余額、用戶姓名、用戶身份證等,這些都是每個用戶必須包含的數據;

  • JSON 數據類型推薦使用在不經常更新的靜態數據存儲。

參考:

1、30 mins with MySQL JSON functions:https://dasini.net/blog/2018/07/23/30-mins-with-mysql-json-functions/

2、拉鈎教育《姜承堯的MySQL實戰寶典》-04 | 非結構存儲:用好 JSON 這張牌:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=869#/detail/pc?id=7320


免責聲明!

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



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