mysql—对大量数据使用json\U extract这样的sql函数好吗

wwwo4jvm  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(344)

我正在实现一个数据库,它将每天访问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\u extract和oracle json\u value,可以吗。
对废弃开放。谢谢。

8gsdolmq

8gsdolmq1#

如果你知道所有的行都有 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);
ljsrvy3e

ljsrvy3e2#

mysql 8.0.21引入了一个新函数 JSON_VALUE :
json\u值(json\u doc,path)
按照指定文档中给定的路径从json文档中提取值,并返回提取的值,还可以选择将其转换为所需的类型。
json_value()简化了在json列上创建索引的过程,因为在许多情况下不需要先创建生成的列,然后再在生成的列上创建索引。在创建具有json列的表t1时,可以通过在表达式上创建索引来实现这一点,该表达式使用对该列进行操作的json\ U value()(具有与该列中的值匹配的路径)
在这种情况下:

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

db<>小提琴演示

相关问题