MySQL 查询返回 JSON 数据需要很长时间
Posted
技术标签:
【中文标题】MySQL 查询返回 JSON 数据需要很长时间【英文标题】:MySQL query to return JSON data is taking a very long time 【发布时间】:2021-11-18 19:29:35 【问题描述】:我正在尝试运行查询以从 mysql 表中提取一些 JSON 数据,但这需要很长时间。我运行了查询,1个多小时后仍然没有返回。届时 AWS 终端窗口已超时。
这是表格的样子:
mytable1
+------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| m_id | varchar(100) | YES | | NULL | |
| t_id | int | YES | | NULL | |
| timestamp | int | YES | | NULL | |
| mydata | json | YES | | NULL | |
+------------------+--------------+------+-----+---------+-------+
mydata 列有这样的 json 数据:
"var1": "adfsfs",
"var2": "dafdafds",
"abc1":
"vals":
"x1": 11,
"yz": [4,3,5,5]
这是查询:
select JSON_EXTRACT(mydata,'$.abc1') from mytable1 where timestamp=1627003989;
表中的行数少于 90,000。每行只有大约 1 MB,其中大部分位于“mydata”字段中。
只有一个索引 - 在 m_id 字段上。
知道为什么要花这么长时间吗?还有其他方法可以从该 json 列中提取数据吗?
【问题讨论】:
有多少条记录具有该时间戳值?返回SELECT COUNT(1) FROM mytable1 WHERE timestamp=1627003989
需要多长时间?
不到 90,000 条记录,因为每条记录都有一个与之关联的时间戳。该查询耗时不到 0.5 秒。
每行 1MB 相当大。这大约是 90GB 的数据,加上解析记录和提取所需密钥所需的时间
我不明白的是,即使我不使用 JSON_EXTRACT 而只是说:select * from mytable1 where timestamp=1627003989
,它也需要永远。那甚至不应该对 JSON 数据进行任何解析,对吧?应该做的就是查看匹配的时间戳并返回整个记录。
如果timestamp
列上没有索引,那么它必须进行表扫描,检查每一行。这意味着在它甚至开始从 JSON 文档中提取您想要的字段之前,将 90GB 从磁盘中提取到缓冲池中。这可能是花费的大部分时间,比 JSON 提取成本高得多。
【参考方案1】:
在时间戳列上添加索引。
【讨论】:
以上是关于MySQL 查询返回 JSON 数据需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章