内容简介:本文主要介绍MariaDB JSON数据类型的使用方法与实践,包括JSON数据类型的基本概念、JSON数据结构、JSON函数等内容。通过实际案例讲解JSON数据的存储、查询和处理,帮助读者掌握JSON数据类型的使用技能。风哥教程参考MariaDB官方文档JSON Data Type、JSON Functions等相关内容。
Part01-基础概念与理论知识
1.1 JSON数据类型的基本概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。MariaDB从10.2.7版本开始支持JSON数据类型,用于存储JSON格式的数据。
JSON数据类型的主要特点:
- 自动验证:存储的JSON数据会自动验证其格式是否正确
- 高效存储:JSON数据会被优化存储,减少存储空间
- 支持索引:可以为JSON数据中的字段创建索引
- 丰富的函数支持:提供了大量的JSON函数,用于处理JSON数据
1.2 JSON数据结构
JSON数据结构主要包括两种类型:
- 对象(Object):由键值对组成,使用花括号{}包围,如:{“name”: “John”, “age”: 30}
- 数组(Array):由值的列表组成,使用方括号[]包围,如:[1, 2, 3, 4, 5]
JSON值可以是:
- 字符串(String):使用双引号包围的文本
- 数字(Number):整数或浮点数
- 布尔值(Boolean):true或false
- null:表示空值
- 对象(Object):嵌套的键值对
- 数组(Array):嵌套的值列表
1.3 JSON函数
MariaDB提供了丰富的JSON函数,用于处理JSON数据:
- JSON_ARRAY():创建JSON数组
- JSON_OBJECT():创建JSON对象
- JSON_EXTRACT():从JSON数据中提取值
- JSON_SET():设置JSON数据中的值
- JSON_REMOVE():删除JSON数据中的值
- JSON_SEARCH():搜索JSON数据中的值
- JSON_VALID():验证JSON数据是否有效
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 JSON数据类型的适用场景
JSON数据类型适用于以下场景:
- 半结构化数据:数据结构不固定,经常变化
- 嵌套数据:数据具有多层嵌套结构
- 配置数据:存储应用程序的配置信息
- 日志数据:存储结构化的日志信息
- API响应数据:存储API返回的JSON格式数据
2.2 性能优化建议
性能优化建议:
- 合理使用JSON数据类型:只在必要时使用JSON数据类型,避免过度使用
- 为常用字段创建索引:为JSON数据中经常查询的字段创建索引
- 优化JSON查询:使用合适的JSON函数,避免全表扫描
- 限制JSON数据大小:避免存储过大的JSON数据,影响性能
- 定期维护:定期优化包含JSON数据的表
2.3 存储规范
存储规范建议:
- 数据结构设计:合理设计JSON数据结构,避免过深的嵌套
- 数据验证:确保存储的JSON数据格式正确
- 字段命名:使用有意义的字段名,提高可读性
- 数据压缩:对于大型JSON数据,可以考虑使用压缩
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 JSON数据类型的使用
更多学习教程公众号风哥教程itpux_com
# JSON数据类型的使用
MariaDB [(none)]> # 1. 创建包含JSON字段的表
CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 2. 插入JSON数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”}’);
# 3. 使用JSON_ARRAY()创建数组
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Laptop’, 1999.99, JSON_ARRAY(‘Dell’, ‘XPS 13’, 16, 512));
# 4. 使用JSON_OBJECT()创建对象
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Tablet’, 699.99, JSON_OBJECT(‘brand’, ‘Samsung’, ‘model’, ‘Galaxy Tab S7’, ‘storage’, 128, ‘color’, ‘silver’));
# 5. 查询JSON数据
SELECT id, name, price, attributes FROM fgedu_products;
MariaDB [(none)]> # 1. 创建包含JSON字段的表
CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 2. 插入JSON数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”}’);
# 3. 使用JSON_ARRAY()创建数组
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Laptop’, 1999.99, JSON_ARRAY(‘Dell’, ‘XPS 13’, 16, 512));
# 4. 使用JSON_OBJECT()创建对象
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Tablet’, 699.99, JSON_OBJECT(‘brand’, ‘Samsung’, ‘model’, ‘Galaxy Tab S7’, ‘storage’, 128, ‘color’, ‘silver’));
# 5. 查询JSON数据
SELECT id, name, price, attributes FROM fgedu_products;
3.2 JSON函数的使用
# JSON函数的使用
MariaDB [(none)]> # 1. JSON_EXTRACT():提取JSON值
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand FROM fgedu_products;
# 2. JSON_SET():设置JSON值
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
# 3. JSON_REMOVE():删除JSON值
UPDATE fgedu_products SET attributes = JSON_REMOVE(attributes, ‘$.color’) WHERE id = 1;
# 4. JSON_SEARCH():搜索JSON值
SELECT id, name FROM fgedu_products WHERE JSON_SEARCH(attributes, ‘one’, ‘Apple’) IS NOT NULL;
# 5. JSON_VALID():验证JSON数据
SELECT id, name, JSON_VALID(attributes) AS is_valid FROM fgedu_products;
# 6. JSON_ARRAYAGG():聚合为JSON数组
SELECT JSON_ARRAYAGG(name) AS products FROM fgedu_products;
# 7. JSON_OBJECTAGG():聚合为JSON对象
SELECT JSON_OBJECTAGG(id, name) AS product_map FROM fgedu_products;
MariaDB [(none)]> # 1. JSON_EXTRACT():提取JSON值
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand FROM fgedu_products;
# 2. JSON_SET():设置JSON值
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
# 3. JSON_REMOVE():删除JSON值
UPDATE fgedu_products SET attributes = JSON_REMOVE(attributes, ‘$.color’) WHERE id = 1;
# 4. JSON_SEARCH():搜索JSON值
SELECT id, name FROM fgedu_products WHERE JSON_SEARCH(attributes, ‘one’, ‘Apple’) IS NOT NULL;
# 5. JSON_VALID():验证JSON数据
SELECT id, name, JSON_VALID(attributes) AS is_valid FROM fgedu_products;
# 6. JSON_ARRAYAGG():聚合为JSON数组
SELECT JSON_ARRAYAGG(name) AS products FROM fgedu_products;
# 7. JSON_OBJECTAGG():聚合为JSON对象
SELECT JSON_OBJECTAGG(id, name) AS product_map FROM fgedu_products;
3.3 索引与查询优化
# 索引与查询优化
MariaDB [(none)]> # 1. 为JSON字段创建索引
CREATE INDEX idx_attributes_brand ON fgedu_products((JSON_VALUE(attributes, ‘$.brand’)));
# 2. 使用索引查询
EXPLAIN SELECT id, name FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.brand’) = ‘Apple’;
# 3. 优化JSON查询
# 不好的写法
SELECT id, name FROM fgedu_products WHERE JSON_EXTRACT(attributes, ‘$.price’) > 1000;
# 好的写法
CREATE INDEX idx_attributes_price ON fgedu_products((JSON_VALUE(attributes, ‘$.price’)));
SELECT id, name FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.price’) > 1000;
# 4. 使用JSON_CONTAINS()查询
SELECT id, name FROM fgedu_products WHERE JSON_CONTAINS(attributes, ‘”Apple”‘, ‘$.brand’);
MariaDB [(none)]> # 1. 为JSON字段创建索引
CREATE INDEX idx_attributes_brand ON fgedu_products((JSON_VALUE(attributes, ‘$.brand’)));
# 2. 使用索引查询
EXPLAIN SELECT id, name FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.brand’) = ‘Apple’;
# 3. 优化JSON查询
# 不好的写法
SELECT id, name FROM fgedu_products WHERE JSON_EXTRACT(attributes, ‘$.price’) > 1000;
# 好的写法
CREATE INDEX idx_attributes_price ON fgedu_products((JSON_VALUE(attributes, ‘$.price’)));
SELECT id, name FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.price’) > 1000;
# 4. 使用JSON_CONTAINS()查询
SELECT id, name FROM fgedu_products WHERE JSON_CONTAINS(attributes, ‘”Apple”‘, ‘$.brand’);
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 JSON数据存储案例
场景描述:存储产品的详细属性信息,使用JSON数据类型。
# 创建产品表
MariaDB [(none)]> CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 插入产品数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES
(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”, “specs”: {“cpu”: “A15 Bionic”, “ram”: 4, “camera”: “12MP”}}’),
(‘Laptop’, 1999.99, ‘{“brand”: “Dell”, “model”: “XPS 13”, “storage”: 512, “color”: “silver”, “specs”: {“cpu”: “Intel i7”, “ram”: 16, “display”: “13.3 inch”}}’),
(‘Tablet’, 699.99, ‘{“brand”: “Samsung”, “model”: “Galaxy Tab S7”, “storage”: 128, “color”: “silver”, “specs”: {“cpu”: “Snapdragon 865+”, “ram”: 6, “display”: “11 inch”}}’);
# 查询产品数据
SELECT id, name, price, attributes FROM fgedu_products;
MariaDB [(none)]> CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 插入产品数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES
(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”, “specs”: {“cpu”: “A15 Bionic”, “ram”: 4, “camera”: “12MP”}}’),
(‘Laptop’, 1999.99, ‘{“brand”: “Dell”, “model”: “XPS 13”, “storage”: 512, “color”: “silver”, “specs”: {“cpu”: “Intel i7”, “ram”: 16, “display”: “13.3 inch”}}’),
(‘Tablet’, 699.99, ‘{“brand”: “Samsung”, “model”: “Galaxy Tab S7”, “storage”: 128, “color”: “silver”, “specs”: {“cpu”: “Snapdragon 865+”, “ram”: 6, “display”: “11 inch”}}’);
# 查询产品数据
SELECT id, name, price, attributes FROM fgedu_products;
执行结果:
+—-+———–+———+———————————————————————————————————————–+
| id | name | price | attributes |
+—-+———–+———+———————————————————————————————————————–+
| 1 | Smartphone | 999.99 | {“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”, “specs”: {“cpu”: “A15 Bionic”, “ram”: 4, “camera”: “12MP”}} |
| 2 | Laptop | 1999.99 | {“brand”: “Dell”, “model”: “XPS 13”, “storage”: 512, “color”: “silver”, “specs”: {“cpu”: “Intel i7”, “ram”: 16, “display”: “13.3 inch”}} |
| 3 | Tablet | 699.99 | {“brand”: “Samsung”, “model”: “Galaxy Tab S7”, “storage”: 128, “color”: “silver”, “specs”: {“cpu”: “Snapdragon 865+”, “ram”: 6, “display”: “11 inch”}} |
+—-+———–+———+———————————————————————————————————————–+
| id | name | price | attributes |
+—-+———–+———+———————————————————————————————————————–+
| 1 | Smartphone | 999.99 | {“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”, “specs”: {“cpu”: “A15 Bionic”, “ram”: 4, “camera”: “12MP”}} |
| 2 | Laptop | 1999.99 | {“brand”: “Dell”, “model”: “XPS 13”, “storage”: 512, “color”: “silver”, “specs”: {“cpu”: “Intel i7”, “ram”: 16, “display”: “13.3 inch”}} |
| 3 | Tablet | 699.99 | {“brand”: “Samsung”, “model”: “Galaxy Tab S7”, “storage”: 128, “color”: “silver”, “specs”: {“cpu”: “Snapdragon 865+”, “ram”: 6, “display”: “11 inch”}} |
+—-+———–+———+———————————————————————————————————————–+
4.2 JSON函数使用案例
场景描述:使用JSON函数查询和修改产品数据。
# 使用JSON函数
MariaDB [(none)]> # 1. 提取品牌和型号
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand, JSON_EXTRACT(attributes, ‘$.model’) AS model FROM fgedu_products;
# 2. 提取嵌套的CPU信息
SELECT id, name, JSON_EXTRACT(attributes, ‘$.specs.cpu’) AS cpu FROM fgedu_products;
# 3. 更新产品价格
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
# 4. 添加新属性
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.warranty’, ‘1 year’) WHERE id = 1;
# 5. 删除属性
UPDATE fgedu_products SET attributes = JSON_REMOVE(attributes, ‘$.color’) WHERE id = 1;
# 6. 搜索特定品牌的产品
SELECT id, name FROM fgedu_products WHERE JSON_SEARCH(attributes, ‘one’, ‘Apple’) IS NOT NULL;
MariaDB [(none)]> # 1. 提取品牌和型号
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand, JSON_EXTRACT(attributes, ‘$.model’) AS model FROM fgedu_products;
# 2. 提取嵌套的CPU信息
SELECT id, name, JSON_EXTRACT(attributes, ‘$.specs.cpu’) AS cpu FROM fgedu_products;
# 3. 更新产品价格
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
# 4. 添加新属性
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.warranty’, ‘1 year’) WHERE id = 1;
# 5. 删除属性
UPDATE fgedu_products SET attributes = JSON_REMOVE(attributes, ‘$.color’) WHERE id = 1;
# 6. 搜索特定品牌的产品
SELECT id, name FROM fgedu_products WHERE JSON_SEARCH(attributes, ‘one’, ‘Apple’) IS NOT NULL;
执行结果:
# 提取品牌和型号
+—-+———–+———-+————-+
| id | name | brand | model |
+—-+———–+———-+————-+
| 1 | Smartphone | “Apple” | “iPhone 13” |
| 2 | Laptop | “Dell” | “XPS 13” |
| 3 | Tablet | “Samsung” | “Galaxy Tab S7” |
+—-+———–+———-+————-+
# 提取嵌套的CPU信息
+—-+———–+——————-+
| id | name | cpu |
+—-+———–+——————-+
| 1 | Smartphone | “A15 Bionic” |
| 2 | Laptop | “Intel i7” |
| 3 | Tablet | “Snapdragon 865+” |
+—-+———–+——————-+
# 搜索特定品牌的产品
+—-+———–+
| id | name |
+—-+———–+
| 1 | Smartphone |
+—-+———–+
+—-+———–+———-+————-+
| id | name | brand | model |
+—-+———–+———-+————-+
| 1 | Smartphone | “Apple” | “iPhone 13” |
| 2 | Laptop | “Dell” | “XPS 13” |
| 3 | Tablet | “Samsung” | “Galaxy Tab S7” |
+—-+———–+———-+————-+
# 提取嵌套的CPU信息
+—-+———–+——————-+
| id | name | cpu |
+—-+———–+——————-+
| 1 | Smartphone | “A15 Bionic” |
| 2 | Laptop | “Intel i7” |
| 3 | Tablet | “Snapdragon 865+” |
+—-+———–+——————-+
# 搜索特定品牌的产品
+—-+———–+
| id | name |
+—-+———–+
| 1 | Smartphone |
+—-+———–+
4.3 复杂JSON数据处理案例
场景描述:处理复杂的JSON数据,包括数组和嵌套对象。
# 复杂JSON数据处理
MariaDB [(none)]> # 1. 创建包含复杂JSON数据的表
CREATE TABLE fgedu_orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50),
user_id INT,
items JSON,
shipping_address JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 2. 插入复杂JSON数据
INSERT INTO fgedu_orders(order_no, user_id, items, shipping_address)
VALUES(
‘ORD20230101006’,
1,
‘[{“product_id”: 1, “name”: “Smartphone”, “quantity”: 1, “price”: 999.99}, {“product_id”: 2, “name”: “Laptop”, “quantity”: 1, “price”: 1999.99}]’,
‘{“street”: “123 Main St”, “city”: “New York”, “state”: “NY”, “zip”: “10001”, “country”: “USA”}’
);
# 3. 查询订单中的商品数量
SELECT id, order_no, JSON_LENGTH(items) AS item_count FROM fgedu_orders;
# 4. 提取第一个商品的名称
SELECT id, order_no, JSON_EXTRACT(items, ‘$[0].name’) AS first_item FROM fgedu_orders;
# 5. 计算订单总金额
SELECT
id,
order_no,
SUM(JSON_EXTRACT(items, CONCAT(‘$[‘, x.idx, ‘].price’)) * JSON_EXTRACT(items, CONCAT(‘$[‘, x.idx, ‘].quantity’))) AS total_amount
FROM
fgedu_orders,
(SELECT 0 AS idx UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) x
WHERE
x.idx < JSON_LENGTH(items)
GROUP BY
id, order_no;
# 6. 提取 shipping address 的城市
SELECT id, order_no, JSON_EXTRACT(shipping_address, ‘$.city’) AS city FROM fgedu_orders;
MariaDB [(none)]> # 1. 创建包含复杂JSON数据的表
CREATE TABLE fgedu_orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(50),
user_id INT,
items JSON,
shipping_address JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 2. 插入复杂JSON数据
INSERT INTO fgedu_orders(order_no, user_id, items, shipping_address)
VALUES(
‘ORD20230101006’,
1,
‘[{“product_id”: 1, “name”: “Smartphone”, “quantity”: 1, “price”: 999.99}, {“product_id”: 2, “name”: “Laptop”, “quantity”: 1, “price”: 1999.99}]’,
‘{“street”: “123 Main St”, “city”: “New York”, “state”: “NY”, “zip”: “10001”, “country”: “USA”}’
);
# 3. 查询订单中的商品数量
SELECT id, order_no, JSON_LENGTH(items) AS item_count FROM fgedu_orders;
# 4. 提取第一个商品的名称
SELECT id, order_no, JSON_EXTRACT(items, ‘$[0].name’) AS first_item FROM fgedu_orders;
# 5. 计算订单总金额
SELECT
id,
order_no,
SUM(JSON_EXTRACT(items, CONCAT(‘$[‘, x.idx, ‘].price’)) * JSON_EXTRACT(items, CONCAT(‘$[‘, x.idx, ‘].quantity’))) AS total_amount
FROM
fgedu_orders,
(SELECT 0 AS idx UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) x
WHERE
x.idx < JSON_LENGTH(items)
GROUP BY
id, order_no;
# 6. 提取 shipping address 的城市
SELECT id, order_no, JSON_EXTRACT(shipping_address, ‘$.city’) AS city FROM fgedu_orders;
执行结果:
# 查询订单中的商品数量
+—-+—————+————+
| id | order_no | item_count |
+—-+—————+————+
| 1 | ORD20230101006 | 2 |
+—-+—————+————+
# 提取第一个商品的名称
+—-+—————+—————-+
| id | order_no | first_item |
+—-+—————+—————-+
| 1 | ORD20230101006 | “Smartphone” |
+—-+—————+—————-+
# 计算订单总金额
+—-+—————+————–+
| id | order_no | total_amount |
+—-+—————+————–+
| 1 | ORD20230101006 | 2999.98 |
+—-+—————+————–+
# 提取 shipping address 的城市
+—-+—————+———–+
| id | order_no | city |
+—-+—————+———–+
| 1 | ORD20230101006 | “New York” |
+—-+—————+———–+
+—-+—————+————+
| id | order_no | item_count |
+—-+—————+————+
| 1 | ORD20230101006 | 2 |
+—-+—————+————+
# 提取第一个商品的名称
+—-+—————+—————-+
| id | order_no | first_item |
+—-+—————+—————-+
| 1 | ORD20230101006 | “Smartphone” |
+—-+—————+—————-+
# 计算订单总金额
+—-+—————+————–+
| id | order_no | total_amount |
+—-+—————+————–+
| 1 | ORD20230101006 | 2999.98 |
+—-+—————+————–+
# 提取 shipping address 的城市
+—-+—————+———–+
| id | order_no | city |
+—-+—————+———–+
| 1 | ORD20230101006 | “New York” |
+—-+—————+———–+
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 JSON数据类型使用最佳实践
风哥提示:在使用JSON数据类型时,应遵循最佳实践,提高代码的质量、性能和可维护性。
- 合理使用JSON数据类型:只在必要时使用JSON数据类型,避免过度使用
- 设计合理的JSON结构:避免过深的嵌套,保持JSON结构清晰
- 为常用字段创建索引:为JSON数据中经常查询的字段创建索引
- 使用合适的JSON函数:根据需要选择合适的JSON函数,提高查询效率
- 验证JSON数据:确保存储的JSON数据格式正确
5.2 性能优化技巧
- 使用索引:为JSON数据中经常查询的字段创建索引
- 优化JSON查询:使用合适的JSON函数,避免全表扫描
- 限制JSON数据大小:避免存储过大的JSON数据,影响性能
- 使用JSON_CONTAINS()代替LIKE:对于JSON数据的搜索,使用JSON_CONTAINS()比LIKE更高效
- 定期维护:定期优化包含JSON数据的表
5.3 常见问题与解决方案
- JSON数据验证失败:确保存储的JSON数据格式正确,使用JSON_VALID()验证
- 索引不生效:确保为JSON字段创建了正确的索引,使用EXPLAIN检查执行计划
- 性能问题:优化JSON查询,为常用字段创建索引,限制JSON数据大小
- 嵌套过深:避免JSON数据嵌套过深,保持结构清晰
- 数据类型转换:注意JSON数据类型与其他数据类型的转换
# JSON数据类型使用示例
— 创建表
CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
— 插入数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”}’);
— 创建索引
CREATE INDEX idx_attributes_brand ON fgedu_products((JSON_VALUE(attributes, ‘$.brand’)));
— 查询数据
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.brand’) = ‘Apple’;
— 更新数据
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
— 创建表
CREATE TABLE fgedu_products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
price DECIMAL(10,2),
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
— 插入数据
INSERT INTO fgedu_products(name, price, attributes)
VALUES(‘Smartphone’, 999.99, ‘{“brand”: “Apple”, “model”: “iPhone 13”, “storage”: 128, “color”: “black”}’);
— 创建索引
CREATE INDEX idx_attributes_brand ON fgedu_products((JSON_VALUE(attributes, ‘$.brand’)));
— 查询数据
SELECT id, name, JSON_EXTRACT(attributes, ‘$.brand’) AS brand FROM fgedu_products WHERE JSON_VALUE(attributes, ‘$.brand’) = ‘Apple’;
— 更新数据
UPDATE fgedu_products SET attributes = JSON_SET(attributes, ‘$.price’, 899.99) WHERE id = 1;
通过以上措施,可以有效提高MariaDB JSON数据类型的使用质量和性能,确保系统稳定运行。
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
