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 数据需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

在 MYSQL 表上选择查询需要很长时间并超时

我想减少 MYSQL 查询执行时间。我的查询需要很长时间?

MySql 查询需要很长时间 PHP

MySQL - INSERT 查询需要很长时间

为啥这个查询需要这么长时间?

MySQL 服务器上非常简单的 AVG() 聚合查询需要很长时间