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

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函数。

相关帖子
别墅抵押贷款可以用于投资吗?投资用途抵押贷款风险与合规
别墅抵押贷款可以用于投资吗?投资用途抵押贷款风险与合规
海口企业获客渠道#网站开发设计服务,专业团队
海口企业获客渠道#网站开发设计服务,专业团队
消费者在购物时,如何通过识别标签选择真正对环境友好的节能产品?
消费者在购物时,如何通过识别标签选择真正对环境友好的节能产品?
2026 年买新国标电动车,商家说能解码提速,上路会被查吗?
2026 年买新国标电动车,商家说能解码提速,上路会被查吗?
海口搜索引擎优化#专业网站建设优化,提供一站式建站服务
海口搜索引擎优化#专业网站建设优化,提供一站式建站服务
海口网站建设本地公司@网站维护,价格透明
海口网站建设本地公司@网站维护,价格透明
汽车贷款利率合同怎么签?看清条款防止被坑
汽车贷款利率合同怎么签?看清条款防止被坑
淄博120救护车出租跨省服务|急救车长途转运护送病人
淄博120救护车出租跨省服务|急救车长途转运护送病人
陵水网站优化推广服务公司@营销网站建设,模板建站
陵水网站优化推广服务公司@营销网站建设,模板建站
大同120救护车出租收费标准-长途120救护车护送,按公里收费
大同120救护车出租收费标准-长途120救护车护送,按公里收费
临沂病人跨省市转运服务车租赁公司|长途医疗护送车,随时派车全国护送
临沂病人跨省市转运服务车租赁公司|长途医疗护送车,随时派车全国护送
台州购物网站开发#网站开发本地公司,一站式服务
台州购物网站开发#网站开发本地公司,一站式服务
淮南长途120救护车出租转运病人-长途救护车租车转运病人
淮南长途120救护车出租转运病人-长途救护车租车转运病人
押证不押车贷款办理流程,车辆里程数对贷款额度的影响
押证不押车贷款办理流程,车辆里程数对贷款额度的影响
绵阳网站建设推广服务@AI数字人视频制作,专业设计团队
绵阳网站建设推广服务@AI数字人视频制作,专业设计团队
临汾病人转院租救护车-跨省转院救护车租赁,随时派车全国护送
临汾病人转院租救护车-跨省转院救护车租赁,随时派车全国护送
秦皇岛精准获客软件#企业网站搭建,企业解决方案
秦皇岛精准获客软件#企业网站搭建,企业解决方案
由单位统一申办的社保卡和个人自行申办的,在补办流程上是否有区别?
由单位统一申办的社保卡和个人自行申办的,在补办流程上是否有区别?
阜阳120救护车跑长途出租-租救护车护送病人转院
阜阳120救护车跑长途出租-租救护车护送病人转院
潍坊正规救护车出租|危重患者转院,专业医护跟车
潍坊正规救护车出租|危重患者转院,专业医护跟车
别墅抵押贷款和信用贷款哪个划算?利率、额度与期限对比
别墅抵押贷款和信用贷款哪个划算?利率、额度与期限对比