使用JSON_EXTRACT这样的SQL函数处理大量数据是否很好

时间:2018-11-27 10:01:35

标签: mysql sql database oracle database-performance

我正在实现一个数据库,该数据库每天要达到 2000 条记录,并且我将通过使用 SQL 函数(例如 Mysql JSON_EXTRACT ORACLE JSON_VALUE 。迷恋。我将数据存储在JSON列中。

我将使用 Mysql JSON_EXTRACT ORACLE JSON_VALUE 函数搜索如下所示的数据范围

SELECT *
FROM audit
where json_extract(detail_x,'$.eventDt') > '2017-10-01 00:00:00'
  And json_extract(detail,'$.eventDt')   < '2018-11-01 00:00:00'

最大日期范围为 30天。所以, 最大行数约为2000 * 30 = 60000

我的问题是。在这种情况下,使用 SQL 函数(例如 Mysql JSON_EXTRACT ORACLE JSON_VALUE )是否合适?

开放讨论。 谢谢。

2 个答案:

答案 0 :(得分:4)

如果您知道所有行都有eventDt,则应将其提取到列中。然后,该列上的索引将加快许多查询的速度。诚然,索引对于这么宽的时间跨度可能没有用,但是当您检索少量记录时,它应该可以提高性能。

JSON的目的应该是存储具有不适合列的不规则格式的数据。 MySQL不会直接索引JSON。

您始终可以使用生成的列添加索引:

alter table audit
    add column eventDt date generated as (json_extract(detail_x,'$.eventDt')) stored;

create index idx_audit_eventDt on audit(eventDt);

答案 1 :(得分:1)

MySQL 8.0.21引入了新功能JSON_VALUE

JSON_VALUE(json_doc, path)

从JSON文档中的指定文档中给出的路径中提取一个值,并返回提取的值,可以选择将其转换为所需的类型。

JSON_VALUE()简化了在JSON列上的创建索引,因为在很多情况下无需创建生成的列,然后在生成的列上创建索引。您可以在创建表t1时执行此操作通过在使用对该列进行操作的JSON_VALUE()的表达式上创建索引来创建一个JSON列(其路径与该列中的值匹配)

在这种情况下:

CREATE INDEX idx_t1 ON audit( (JSON_VALUE(detail, '$.eventDt' RETURNING DATE)) )

db<>fiddle demo