mysql json查询为什么这么快?

在本地测试中我发现了一件令我惊讶的事情,在300w数据量对json字段里面值进行筛选的时间都在100ms左右!

那么为什么mysql json查询这么快呢?

json并非纯文本

mysql将json字符串储存为紧凑的二进制格式,每个 JSON 文档都有一个类型码(Type Code)和一个数据部分,并作为内部的树状结构(其中包括嵌套元素的层次关系)。

这种格式使得 MySQL 能够直接读取和解析 JSON 数据,而不需要像文本 JSON 一样逐字符或者反序列化解析,从而提高了读取和操作的效率

在json_extract查询中,通过路径参数访问偏移表,然后根据偏移表直接跳到提取数据位置。

路径缓存

此外,在8.0还对路径进行了缓存,这避免重复解析 JSON 文档。这种方式在大量查询相同 JSON 路径时显著提升了性能。

json字段也可以作为表字段

mysql 支持在表中创建基于 json 列的虚拟列和生成列

这些列可以基于 json 提取的结果,提前计算和存储需要的部分数据。这样可以避免在每次查询时都重新解析整个 json 文档,提高查询效率。

比如以下就是根据json字段data中的name创建的生成列

ALTER TABLE my_table ADD COLUMN name VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.name'))) STORED;

甚至mysql还支持为生成列创建索引,以及在8.0直接为json创建全文索引

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值