最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql怎么存儲json格式數據詳解

 更新時間:2022年06月02日 10:49:29   作者:lockie_zou  
在開發(fā)中遇到存取html值的情況,并且要根據id進行實時返回,在做的時候想到了mysql的json類型存儲,下面這篇文章主要給大家介紹了關于Mysql怎么存儲json格式數據的相關資料,需要的朋友可以參考下

前言

Mysql5.7版本以后新增的功能,Mysql提供了一個原生的Json類型,Json值將不再以字符串的形式存儲,而是采用一種允許快速讀取文本元素(document elements)的內部二進制(internal binary)格式。在Json列插入或者更新的時候將會自動驗證Json文本,未通過驗證的文本將產生一個錯誤信息

JSON 數據類型推薦使用在不經常更新的靜態(tài)數據存儲

創(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 '標簽名稱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

登錄方式字段使用json格式,分為phone,wechat,qq,email,zhifubao等等

插入數據:

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 函數作用是 去除json字符串的引號,將值轉成string類型

JSON_EXTRACT 函數作用是 提取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數據 增加索引

 給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,這個列是由函數 login_info->>"$.phone" 計算得到的。然后在這個虛擬列上創(chuàng)建一個唯一索引 idx_uq_phone。這時再通過虛擬列 phone進行查詢,就可以看到優(yōu)化器會使用到新創(chuàng)建的 idx_uq_phone 索引

-- 查看索引
EXPLAIN
select *
from t_user
where phone = '13200001111';

 我們查看表結構,發(fā)現索引增加上去了

使用場景

某些業(yè)務需要做用戶畫像(也就是對用戶打標簽),然后根據用戶的標簽,通過數據挖掘技術,進行相應的產品推薦。比如:

在電商行業(yè)中,根據用戶的穿搭喜好,推薦相應的商品;

在音樂行業(yè)中,根據用戶喜歡的音樂風格和常聽的歌手,推薦相應的歌曲;

在金融行業(yè),根據用戶的風險喜好和投資經驗,推薦相應的理財產品。

在這,我強烈推薦你用 JSON 類型在數據庫中存儲用戶畫像信息,并結合 JSON 數組類型和多值索引的特點進行高效查詢。

創(chuàng)建用戶畫像定義表:

CREATE TABLE `t_tag` (
  `id` int NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '標簽名稱',
  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, '高學歷');
insert into t_tag values (null, '小資');
insert into t_tag values (null, '有車');
insert into t_tag values (null, '有小孩');
insert into t_tag values (null, '喜歡網購');
insert into t_tag values (null, '喜歡點外賣');
insert into t_tag values (null, '蘿莉');

 創(chuàng)建用戶標簽中間表

CREATE TABLE `t_user_tag` (
  `user_id` int NOT NULL COMMENT '用戶id',
  `tag_id` json NOT NULL COMMENT '用戶標簽id',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 插入數據,使用數組的形式存儲

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 數組上創(chuàng)建索引,并通過函數 member of、json_contains、json_overlaps 來快速檢索索引數據。所以你可以在表 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 數據類型,推薦用 MySQL 8.0.17 以上的版本,性能更好,同時也支持 Multi-Valued Indexes;

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

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

JSON 數據類型推薦使用在不經常更新的靜態(tài)數據存儲。

總結 

到此這篇關于Mysql怎么存儲json格式數據的文章就介紹到這了,更多相關Mysql存儲json格式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Sql查詢MySql數據庫中的表名和描述表中字段(列)信息

    Sql查詢MySql數據庫中的表名和描述表中字段(列)信息

    這篇文章主要介紹了Sql查詢獲取MySql數據庫中的表名和描述表中列名數據類型,長度,精度,是否可以為null,默認值,是否自增,是否是主鍵,列描述等列信息
    2017-12-12
  • mysql刪除語句超詳細匯總

    mysql刪除語句超詳細匯總

    這篇文章主要給大家介紹了關于mysql刪除語句超詳細匯總的相關資料,SQL是用于訪問和處理數據庫的標準的計算機語言,簡稱結構化查詢語言,SQL中的刪除語句有多種方法,這里總結下,需要的朋友可以參考下
    2023-08-08
  • 阿里云云服務器mysql密碼找回的方法

    阿里云云服務器mysql密碼找回的方法

    這篇文章主要介紹了阿里云云服務器mysql密碼找回的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • centOS下mysql workbench安裝配置教程

    centOS下mysql workbench安裝配置教程

    這篇文章主要為大家詳細介紹了centOS下mysql workbench安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • MySQL數據庫安裝之離線下載方式

    MySQL數據庫安裝之離線下載方式

    這篇文章主要介紹了MySQL數據庫安裝之離線下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • MySQL基礎教程之DML語句詳解

    MySQL基礎教程之DML語句詳解

    DML 語句是指對數據庫中表的記錄進行的操作,下面這篇文章主要給大家介紹了關于MySQL基礎教程之DML語句的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • 重新restore了mysql到另一臺機器上后mysql 編碼問題報錯

    重新restore了mysql到另一臺機器上后mysql 編碼問題報錯

    重新restore了mysql到另一臺機器上,今天新寫了一個app,發(fā)現在admin界面下一添加漢字就會報錯
    2011-12-12
  • CentOS下RPM方式安裝MySQL5.6教程

    CentOS下RPM方式安裝MySQL5.6教程

    這篇文章主要為大家詳細介紹了CentOS下RPM方式安裝MySQL5.6教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Centos 7下使用RPM包安裝MySQL 5.7.9教程

    Centos 7下使用RPM包安裝MySQL 5.7.9教程

    這篇文章主要為大家詳細介紹了Centos 7下使用RPM包安裝MySQL 5.7.9的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MySQL查詢空字段或非空字段(is null和not null)

    MySQL查詢空字段或非空字段(is null和not null)

    本文介紹在MySQL中,面對值為空(NULL)的字段,應該如何查詢。怎么判斷一個字段的值為NULL或不為NULL,需要的朋友可以參考下
    2016-04-04

最新評論

三江| 阿图什市| 简阳市| 谢通门县| 洱源县| 区。| 柘荣县| 甘德县| 吕梁市| 临沭县| 天柱县| 肃北| 长治县| 河间市| 清原| 沙湾县| 开远市| 玛多县| 滕州市| 读书| 大方县| 佛冈县| 烟台市| 客服| 达日县| 兴化市| 天气| 柘城县| 佛教| 嘉定区| 射洪县| 商城县| 基隆市| 蒙阴县| 葵青区| 方城县| 九龙城区| 虹口区| 茶陵县| 泰州市| 沧源|