我正在实现一个数据库,该数据库每天要达到 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 )是否合适?
开放讨论。 谢谢。
答案 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文档中的指定文档中给出的路径中提取一个值,并返回提取的值,可以选择将其转换为所需的类型。
JSON_VALUE()简化了在JSON列上的创建索引,因为在很多情况下无需创建生成的列,然后在生成的列上创建索引。您可以在创建表t1时执行此操作通过在使用对该列进行操作的JSON_VALUE()的表达式上创建索引来创建一个JSON列(其路径与该列中的值匹配)
在这种情况下:
CREATE INDEX idx_t1 ON audit( (JSON_VALUE(detail, '$.eventDt' RETURNING DATE)) )