MySQL实战:Json字段类型详解(mysql处理json字符串)
myzbx 2025-07-24 20:21 5 浏览
"当产品经理第7次修改需求文档时,我的MySQL表结构终于崩溃了..." 这样的场景你是否似曾相识?在快速迭代的互联网时代,固定表结构常常成为开发者的噩梦。但鲜为人知的是,你手中的MySQL8.0早已暗藏利器——JSON字段类型。今天给大家分享MySQL8.0当中JSON字段类型的用法,在保持关系型数据库严谨性的同时,收获NoSQL般的灵活体验。
一、基础篇:JSON字段操作速成
1.1 创建你的第一个JSON字段
CREATE TABLE user_profiles (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL UNIQUE,
profile JSON NOT NULL COMMENT '用户档案信息',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.2 数据插入的三种方式
标准插入:
INSERT INTO user_profiles (user_id, profile)
VALUES (1001, '{
"basic": {
"name": "张三",
"gender": "male",
"age": 28
},
"preferences": {
"theme": "dark",
"notification": true
}
}');
动态生成JSON:
INSERT INTO user_profiles (user_id, profile)
VALUES (1002, JSON_OBJECT(
'basic', JSON_OBJECT(
'name', '李四',
'birthday', CURDATE() - INTERVAL 25 YEAR
),
'social', JSON_ARRAY('wechat', 'dingtalk')
));
程序生成示例(Python):
import json
profile = {
"experimental_features": {
"dark_mode": True,
"beta_test": False
}
}
cursor.execute("INSERT INTO user_profiles (user_id, profile) VALUES (%s, %s)",
(1003, json.dumps(profile)))
二、查询方式
2.1 精确路径查询
-- 查询所有使用深色主题的用户
SELECT user_id, profile->"$.preferences.theme" AS theme
FROM user_profiles
WHERE profile->"$.preferences.theme" = 'dark';
2.2 动态键值查询
-- 查找包含beta_test功能的用户
SELECT user_id, JSON_EXTRACT(profile, '$.experimental_features.beta_test')
FROM user_profiles
WHERE JSON_CONTAINS_PATH(profile, 'one', '$.experimental_features.beta_test') = 1;
2.3 数组的妙用
-- 查询最近访问过杭州的用户
SELECT user_id, JSON_SEARCH(profile->'$.locations', 'all', '杭州') AS found
FROM user_profiles
WHERE JSON_CONTAINS(profile->'$.locations', '"杭州"');
三、动态Schema设计实战
3.1 动态字段扩展方案
元数据表设计:
CREATE TABLE dynamic_fields (
field_id INT AUTO_INCREMENT PRIMARY KEY,
field_name VARCHAR(50) NOT NULL UNIQUE,
data_type ENUM('string','number','boolean') NOT NULL,
description TEXT
);
-- 示例字段注册
INSERT INTO dynamic_fields (field_name, data_type) VALUES
('membership_level', 'number'),
('wechat_openid', 'string');
动态校验存储过程:
DELIMITER //
CREATE PROCEDURE safe_json_insert(
IN uid INT,
IN jdata JSON
)
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '22032'
BEGIN
SELECT 'Invalid JSON structure' AS error;
END;
INSERT INTO user_profiles (user_id, profile)
VALUES (uid, jdata);
END //
DELIMITER ;
四、性能优化三板斧
4.1 索引优化方案
-- 为常用查询字段创建虚拟列+索引
ALTER TABLE user_profiles
ADD COLUMN user_name VARCHAR(50)
GENERATED ALWAYS AS (profile->"$.basic.name") VIRTUAL,
ADD INDEX idx_name (user_name);
4.2 查询优化技巧
-- 低效查询 全表扫描
SELECT * FROM user_profiles
WHERE JSON_EXTRACT(profile, '$.preferences.notification') = true;
-- 优化后查询
SELECT * FROM user_profiles
WHERE profile->"$.preferences.notification" = CAST(true AS JSON);
执行计划对比:
原始查询:type=ALL, rows=1000
优化后:type=range, rows=50
五、实战案例:电商用户画像系统
场景需求:
- 每个商户可自定义用户属性
- 需要支持多维度组合查询
- 属性变更需记录历史版本
混合存储方案:
CREATE TABLE customer_profiles (
id INT PRIMARY KEY AUTO_INCREMENT,
shop_id INT NOT NULL,
core_data JSON NOT NULL COMMENT '核心固定字段',
extended_data JSON NOT NULL COMMENT '扩展动态字段',
version INT DEFAULT 0,
INDEX idx_shop (shop_id)
);
-- 版本管理触发器
DELIMITER //
CREATE TRIGGER before_profile_update
BEFORE UPDATE ON customer_profiles
FOR EACH ROW
BEGIN
INSERT INTO profile_history
SELECT NULL, OLD.*;
SET NEW.version = OLD.version + 1;
END //
DELIMITER ;
总结
通过本文的实战演练,我们看到MySQL的JSON字段在以下场景还是非常实用的:
- 快速迭代期的临时方案
- 稀疏字段的存储优化
- 混合结构数据场景
- 作为分库分表前的缓冲方案
但也要注意其局限性:当JSON文档超过1MB时,性能会显著下降;完全非结构化的数据存储还是应该考虑专门的文档数据库。
相关推荐
- 大白话讲nnvm(大白话讲解什么是卷积)
-
之前工作经验中,在某大厂,开发过机器学习框架,在和业务同学的合作下,取得还可以的成绩,但是一直觉得缺少了什么,最近在刷ai-system相关的公开课,才明白计算图的重要性,以往觉得不能理解的东西,现在...
- Python之Json模块详解(python.json()用法)
-
Step1:Json是什么JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式。具有数据格式简单,读写方便易懂等很多优点。许多主流的编程语言都...
- 最新潮最流行的影音资源——MAU影视
-
MAO影视,一款完全免费的影视软件,为您带来最新潮最流行的影音资源,软件本身并不具备任何资源,只是作为一款播放器提供给大家。配合相关的接口链接,即可为您呈现丰富多彩的影音节目。软件版本支持:1.安卓2...
- Python版的迷你程序——json文件转换为csv
-
浅话C语言是过去几十年软件和硬件两个阵营之间,签署的最坚实的契约。硬件为C语言的语义提供了最能发挥其性能的基础构件,而软件虽然搞了很多的圆环套圆环般的层次,但最终都以C语言作为最后的沉淀收尾。----...
- 没硬盘、网盘也能看片自由!NAS一键部署MoonTV,随时随地爽看。
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙有没有一个应用服务,能满足既没有足够预算购置硬盘,也不想依托网盘的朋友的家庭观影需求?之前我介绍过LibreTV,本篇再来看看另一个更...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- Python的dict和json区别(python中dict的特点)
-
大家有没有发现,python中的字典类型的数据结构,和我们目前比较流行的web端的json格式,非常类似,几乎有点分不清了。那么这2者的区别是什么呢?首先,从概念上,我们要理解这2者是截然不同的。py...
- 越晚搞懂 MySQL JSON 数据类型,你就越吃亏
-
作者介绍陈臣,甲骨文MySQL首席解决方案工程师,公众号《MySQL实战》作者,有大规模的MySQL,Redis,MongoDB,ES的管理和维护经验,擅长MySQL数据库的性能优化及日常操作的原理剖...
- 揭秘你不会画“信息结构图”的本质
-
编辑导语:产品信息结构图有助于清晰地展示产品信息,一定程度上可以为后台上传数据提供依据,但不少人可能觉得产品信息结构图很难,这可能是对数据库表结构不理解等因素导致的。本篇文章里,作者就产品信息结构图的...
- python之json基本操作(.json python)
-
1.概述JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它具有简洁、清晰的层次结构,易于阅读和编写,还可以有效的提升网络传输效率。Python标准库的...
- JWT 和 JJWT 还傻傻的分不清吗(jwt jti)
-
JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、...
- 比json快20-100倍!protobuf原理深入剖析
-
一、protobuf语法指南1.1定义一个消息类型先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结...
- 了解一下ProtoBuf(了解一下相亲对象的年龄)
-
序列化与反序列化我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。那么我们...
- JSON数据类型详细总结(json数据类型详细总结怎么写)
-
JSON详解一、JSON的概述及其使用JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它基于javascript的一个子集。JSON是的数据交换语言,易...
- 接口自动化测试之JSON Schema模式该如何使用?
-
JSONSchema模式是一个词汇表,可用于注释和验证JSON文档。在实际工作中,对接口返回值进行断言校验,除了常用字段的断言检测以外,还要对其他字段的类型进行检测。对返回的字段一个个写断言显...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)