【问题标题】:MySQL query to return JSON data is taking a very long timeMySQL 查询返回 JSON 数据需要很长时间
【发布时间】: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 提取成本高得多。

标签: mysql query-optimization


【解决方案1】:

在时间戳列上添加索引。

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多