【发布时间】: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 提取成本高得多。