欢迎光临海口中国转运服务网
详情描述

1. 创建索引(关键优化)

-- 对JSON字段创建虚拟列并建立索引
ALTER TABLE products ADD COLUMN category_name VARCHAR(50) 
    AS (JSON_UNQUOTE(JSON_EXTRACT(metadata, '$.category')));

CREATE INDEX idx_category ON products(category_name);

-- MySQL 8.0+ 支持函数索引
CREATE INDEX idx_price ON products((CAST(metadata->>'$.price' AS DECIMAL(10,2))));

2. 基础查询方法

使用 -> 和 ->>

-- -> 返回JSON(保持引号)
SELECT metadata->'$.category' FROM products;

-- ->> 返回文本(去除引号)
SELECT metadata->>'$.category' FROM products;

-- 条件查询
SELECT * FROM products 
WHERE metadata->>'$.category' = 'electronics';

SELECT * FROM orders 
WHERE JSON_EXTRACT(metadata, '$.status') = 'shipped';

3. 路径查询操作符

-- 访问嵌套对象
SELECT metadata->'$.details.specifications.weight'
FROM products;

-- 数组访问
SELECT metadata->'$.tags[0]'
FROM products;

-- 通配符查询(数组所有元素)
SELECT metadata->'$.tags[*]'
FROM products;

4. JSON函数优化查询

-- JSON_CONTAINS 检查是否存在
SELECT * FROM products 
WHERE JSON_CONTAINS(metadata, '"electronics"', '$.category');

-- JSON_SEARCH 搜索文本
SELECT * FROM products 
WHERE JSON_SEARCH(metadata, 'one', 'laptop') IS NOT NULL;

-- JSON_EXTRACT 多路径查询
SELECT JSON_EXTRACT(metadata, '$.price', '$.category')
FROM products;

-- JSON_KEYS 获取所有键
SELECT JSON_KEYS(metadata) FROM products;

5. 数组操作优化

-- 检查数组包含
SELECT * FROM products 
WHERE JSON_CONTAINS(metadata->'$.tags', '["sale", "new"]');

-- 数组长度
SELECT * FROM products 
WHERE JSON_LENGTH(metadata->'$.tags') > 3;

-- 展开JSON数组为多行(MySQL 8.0+)
SELECT p.id, jt.tag
FROM products p
JOIN JSON_TABLE(
    p.metadata->'$.tags',
    '$[*]' COLUMNS(tag VARCHAR(50) PATH '$')
) AS jt;

6. 性能优化建议

使用虚拟列+索引

-- 对频繁查询的字段创建虚拟列
ALTER TABLE products
ADD COLUMN price DECIMAL(10,2) 
    AS (CAST(metadata->>'$.price' AS DECIMAL(10,2))) STORED,
ADD INDEX idx_price (price);

-- 查询时使用虚拟列
SELECT * FROM products WHERE price > 1000;

避免全表扫描

-- 差的写法:函数操作在左侧
SELECT * FROM products 
WHERE JSON_UNQUOTE(JSON_EXTRACT(metadata, '$.category')) = 'electronics';

-- 好的写法:如果创建了虚拟列索引
SELECT * FROM products WHERE category_name = 'electronics';

使用覆盖索引

-- 创建包含JSON字段和常用列的复合索引
CREATE INDEX idx_metadata_filter ON products(category_name, metadata);

7. 最佳实践示例

-- 1. 复杂条件查询
SELECT 
    id,
    metadata->>'$.name' as product_name,
    CAST(metadata->>'$.price' AS DECIMAL(10,2)) as price,
    JSON_LENGTH(metadata->'$.tags') as tag_count
FROM products
WHERE metadata->>'$.category' = 'electronics'
    AND CAST(metadata->>'$.price' AS DECIMAL(10,2)) > 500
    AND JSON_CONTAINS(metadata->'$.tags', '"wireless"')
ORDER BY CAST(metadata->>'$.price' AS DECIMAL(10,2)) DESC;

-- 2. 聚合查询
SELECT 
    metadata->>'$.category' as category,
    COUNT(*) as count,
    AVG(CAST(metadata->>'$.price' AS DECIMAL(10,2))) as avg_price
FROM products
GROUP BY metadata->>'$.category'
HAVING avg_price > 100;

-- 3. 更新JSON字段(保持其他部分不变)
UPDATE products
SET metadata = JSON_SET(metadata, '$.stock', 50)
WHERE id = 1;

8. 监控和调试

-- 查看JSON查询执行计划
EXPLAIN FORMAT=JSON
SELECT * FROM products 
WHERE metadata->>'$.category' = 'electronics';

-- 使用性能模式监控
SELECT * FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT LIKE '%JSON%';

注意事项

MySQL版本:JSON功能需要MySQL 5.7+,8.0+版本有更好的优化 数据类型转换:JSON中的数字需要显式转换才能进行数值比较 NULL处理:使用JSON_UNQUOTE(JSON_EXTRACT())->>避免NULL问题 索引使用:直接对JSON字段使用函数会阻止索引使用 存储大小:JSON字段较大时考虑压缩或拆分

选择合适的方法取决于具体场景:简单查询用->>,复杂查询用虚拟列+索引,数组操作用JSON函数。

相关帖子
海口私人救护车长途转运|全国各地都有车,就近派车
海口私人救护车长途转运|全国各地都有车,就近派车
关于糖分摄入,日常生活中哪些隐形糖分来源最容易被我们忽略?
关于糖分摄入,日常生活中哪些隐形糖分来源最容易被我们忽略?
作为灵活就业者,如何进行有效的职业培训以提升抗风险能力?
作为灵活就业者,如何进行有效的职业培训以提升抗风险能力?
海口私人救护车出租跨省-长途120救护车护送,专业接送病人
海口私人救护车出租跨省-长途120救护车护送,专业接送病人
海口高效获客渠道#网站开发服务公司,企业解决方案
海口高效获客渠道#网站开发服务公司,企业解决方案
在定点零售药店购药,如何使用职工医保个人账户或享受门诊统筹报销?
在定点零售药店购药,如何使用职工医保个人账户或享受门诊统筹报销?
石家庄苹果app开发#专业网站设计制作,一站式建站服务
石家庄苹果app开发#专业网站设计制作,一站式建站服务
如何帮助涉罪人员子女应对可能存在的校园社交压力与心理困扰?
如何帮助涉罪人员子女应对可能存在的校园社交压力与心理困扰?
沈阳病人长途转运服务车租赁|医疗转运车租赁,车内设备齐全
沈阳病人长途转运服务车租赁|医疗转运车租赁,车内设备齐全
周口救护车跨省运送病人-长途救护车租车护送病人转院
周口救护车跨省运送病人-长途救护车租车护送病人转院
枣庄网站建设@网站定制公司,一站式服务
枣庄网站建设@网站定制公司,一站式服务
濮阳大型活动保障救护车出租服务-重症急救车出租,按公里收费
濮阳大型活动保障救护车出租服务-重症急救车出租,按公里收费
南阳企业建站#网站设计开发,多年专业建站经验
南阳企业建站#网站设计开发,多年专业建站经验
辽源120救护车跑长途|租救护车护送病人转院
辽源120救护车跑长途|租救护车护送病人转院
未来手机输入法是否能实现跨设备、跨操作系统的无缝同步,并确保同步过程的数据安全?
未来手机输入法是否能实现跨设备、跨操作系统的无缝同步,并确保同步过程的数据安全?
2026年世界范围内的贸易与产业链布局预计将呈现出怎样的调整态势?
2026年世界范围内的贸易与产业链布局预计将呈现出怎样的调整态势?
在2026年,是否有更便捷的数字化工具有助于业主共同监督小区公共收益账目?
在2026年,是否有更便捷的数字化工具有助于业主共同监督小区公共收益账目?
在海外工作期间,如何妥善管理自己的薪酬并进行合理的个人财务规划?
在海外工作期间,如何妥善管理自己的薪酬并进行合理的个人财务规划?
开封活动赛事保障救护车租赁-120救护车租车转运病人
开封活动赛事保障救护车租赁-120救护车租车转运病人