Mysql怎么存儲json格式數(shù)據(jù)詳解
前言
Mysql5.7版本以后新增的功能,Mysql提供了一個原生的Json類型,Json值將不再以字符串的形式存儲,而是采用一種允許快速讀取文本元素(document elements)的內(nèi)部二進制(internal binary)格式。在Json列插入或者更新的時候?qū)詣域炞CJson文本,未通過驗證的文本將產(chǎn)生一個錯誤信息
JSON 數(shù)據(jù)類型推薦使用在不經(jīng)常更新的靜態(tài)數(shù)據(jù)存儲
創(chuàng)建表 t_user
CREATE TABLE `t_user_tag` ( `id` int NOT NULL AUTO_INCREMENT, `tag_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '標(biāo)簽名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
登錄方式字段使用json格式,分為phone,wechat,qq,email,zhifubao等等
插入數(shù)據(jù):
insert into t_user values (1,'tom', 25, '{"email": "1324@qq.com", "phone": "13200001111", "wechat": "147258369"}'); insert into t_user values (2,'jack', 30, '{"phone": "13500001111"}'); insert into t_user values (3,'lily', 18, '{"qq": "147258369", "phone": "13600001111"}'); insert into t_user values (4,'lily', 45, '{"wechat":"1884875663"}');
查詢
用戶名,手機號,微信號
select name, (JSON_EXTRACT(login_info, '$.phone')) phone, JSON_UNQUOTE(JSON_EXTRACT(login_info, '$.wechat')) wechat from t_user;
可以看出
JSON_UNQUOTE 函數(shù)作用是 去除json字符串的引號,將值轉(zhuǎn)成string類型
JSON_EXTRACT 函數(shù)作用是 提取json值
簡潔的寫法作用等同于上面的
select name, login_info ->> '$.phone' phone, login_info ->> '$.wechat' wechat from t_user;
->> 表達式 等同于 JSON_UNQUOTE(JSON_EXTRACT(login_info, '$.wechat'))
-- 使用json中的字段作為查詢條件 select name, login_info ->> '$.phone' phone, login_info ->> '$.wechat' wechat from t_user where login_info ->> '$.phone' = '13200001111';
json數(shù)據(jù) 增加索引
給login_info字段中的手機號增加索引
-- 給login_info這個json中的phone增加索引 alter table t_user add COLUMN phone varchar(11) as (login_info ->> '$.phone'); alter table t_user add UNIQUE INDEX idx_uq_phone(phone);
上述 SQL 首先創(chuàng)建了一個虛擬列 phone,這個列是由函數(shù) login_info->>"$.phone" 計算得到的。然后在這個虛擬列上創(chuàng)建一個唯一索引 idx_uq_phone。這時再通過虛擬列 phone進行查詢,就可以看到優(yōu)化器會使用到新創(chuàng)建的 idx_uq_phone 索引
-- 查看索引 EXPLAIN select * from t_user where phone = '13200001111';
我們查看表結(jié)構(gòu),發(fā)現(xiàn)索引增加上去了
使用場景
某些業(yè)務(wù)需要做用戶畫像(也就是對用戶打標(biāo)簽),然后根據(jù)用戶的標(biāo)簽,通過數(shù)據(jù)挖掘技術(shù),進行相應(yīng)的產(chǎn)品推薦。比如:
在電商行業(yè)中,根據(jù)用戶的穿搭喜好,推薦相應(yīng)的商品;
在音樂行業(yè)中,根據(jù)用戶喜歡的音樂風(fēng)格和常聽的歌手,推薦相應(yīng)的歌曲;
在金融行業(yè),根據(jù)用戶的風(fēng)險喜好和投資經(jīng)驗,推薦相應(yīng)的理財產(chǎn)品。
在這,我強烈推薦你用 JSON 類型在數(shù)據(jù)庫中存儲用戶畫像信息,并結(jié)合 JSON 數(shù)組類型和多值索引的特點進行高效查詢。
創(chuàng)建用戶畫像定義表:
CREATE TABLE `t_tag` ( `id` int NOT NULL AUTO_INCREMENT, `tag_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '標(biāo)簽名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
insert into t_tag values (null, '70后'); insert into t_tag values (null, '80后'); insert into t_tag values (null, '90后'); insert into t_tag values (null, '00后'); insert into t_tag values (null, '10后'); insert into t_tag values (null, '愛運動'); insert into t_tag values (null, '愛聽歌'); insert into t_tag values (null, '愛看電影'); insert into t_tag values (null, '高學(xué)歷'); insert into t_tag values (null, '小資'); insert into t_tag values (null, '有車'); insert into t_tag values (null, '有小孩'); insert into t_tag values (null, '喜歡網(wǎng)購'); insert into t_tag values (null, '喜歡點外賣'); insert into t_tag values (null, '蘿莉');
創(chuàng)建用戶標(biāo)簽中間表
CREATE TABLE `t_user_tag` ( `user_id` int NOT NULL COMMENT '用戶id', `tag_id` json NOT NULL COMMENT '用戶標(biāo)簽id', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
插入數(shù)據(jù),使用數(shù)組的形式存儲
insert into t_user_tag values (1,'[2,4,6]'); insert into t_user_tag values (2,'[1,3,7]'); insert into t_user_tag values (3,'[8,10,12]');
MySQL 8.0.17 版本開始支持 Multi-Valued Indexes,用于在 JSON 數(shù)組上創(chuàng)建索引,并通過函數(shù) member of、json_contains、json_overlaps 來快速檢索索引數(shù)據(jù)。所以你可以在表 UserTag 上創(chuàng)建 Multi-Valued Indexes:
ALTER TABLE t_user_tag ADD INDEX idx_user_tags ((cast((tag_id->"$") as unsigned array)));
查詢愛看電影的
select * from t_user_tag where 8 MEMBER OF(tag_id -> '$');
查詢愛看電影,且有小孩的
select * from t_user_tag where JSON_CONTAINS(tag_id -> '$', '[8,10]');
使用 JSON 數(shù)據(jù)類型,推薦用 MySQL 8.0.17 以上的版本,性能更好,同時也支持 Multi-Valued Indexes;
JSON 數(shù)據(jù)類型的好處是無須預(yù)先定義列,數(shù)據(jù)本身就具有很好的描述性;
不要將有明顯關(guān)系型的數(shù)據(jù)用 JSON 存儲,如用戶余額、用戶姓名、用戶身份證等,這些都是每個用戶必須包含的數(shù)據(jù);
JSON 數(shù)據(jù)類型推薦使用在不經(jīng)常更新的靜態(tài)數(shù)據(jù)存儲。
總結(jié)
到此這篇關(guān)于Mysql怎么存儲json格式數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Mysql存儲json格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sql查詢MySql數(shù)據(jù)庫中的表名和描述表中字段(列)信息
這篇文章主要介紹了Sql查詢獲取MySql數(shù)據(jù)庫中的表名和描述表中列名數(shù)據(jù)類型,長度,精度,是否可以為null,默認(rèn)值,是否自增,是否是主鍵,列描述等列信息2017-12-12重新restore了mysql到另一臺機器上后mysql 編碼問題報錯
重新restore了mysql到另一臺機器上,今天新寫了一個app,發(fā)現(xiàn)在admin界面下一添加漢字就會報錯2011-12-12Centos 7下使用RPM包安裝MySQL 5.7.9教程
這篇文章主要為大家詳細(xì)介紹了Centos 7下使用RPM包安裝MySQL 5.7.9的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05MySQL查詢空字段或非空字段(is null和not null)
本文介紹在MySQL中,面對值為空(NULL)的字段,應(yīng)該如何查詢。怎么判斷一個字段的值為NULL或不為NULL,需要的朋友可以參考下2016-04-04