MySQL如何索引JSON数组?

Posted

技术标签:

【中文标题】MySQL如何索引JSON数组?【英文标题】:MySQL How to Index a JSON array? 【发布时间】:2020-08-19 00:06:02 【问题描述】:

我有一个带有一维数组的 JSON 字段。事实上,在这个字段中,我有一些 ID 的列表,如下所示:

[347470, 162063, 17315, 346852, 174776, 295865, 7833, 136813]

在我的查询中,我这样引用这个字段:

... AND JSON_CONTAINS(`users_actions`, 174776)=0 

我的问题是:我应该为这个字段创建一个索引吗?如果是,我应该使用哪个索引?

【问题讨论】:

你的意思是like this? 值得注意的是,Postgres 在ARRAY,HSTOREJSON 列上做了出色的工作。 mysql 没那么多。 @tadman 我认为这不适用 我认为没有办法在 MySQL 中对此进行索引。你最好规范化架构。 @tadman:同意 Barmar,该技术适用于 JSON 对象,不适用于数组。 【参考方案1】:

如果您运行的是最新版本的 MySQL(8.0.17 或更高版本),则可以使用专门为此目的设计的 Multi-valued index:

多值索引是在存储值数组的列上定义的二级索引。

[...]

多值索引用于索引JSON 数组。

[...]

WHERE 子句中指定以下函数时,优化器使用多值索引来获取记录:MEMBER OF()JSON_CONTAINS()JSON_OVERLAPS()

假设您的 json 数组存储在表 myjs 的列 mytable 中,您可以像这样创建索引:

CREATE INDEX myidx 
ON mytable ( (CAST(myjs AS UNSIGNED ARRAY)) );

【讨论】:

以上是关于MySQL如何索引JSON数组?的主要内容,如果未能解决你的问题,请参考以下文章

SQL JSON PATH 如何在从较大的 json 集中提取后按索引访问 json 数组

如何使用微调器更改 json 数组的索引值?

在mysql json中按值删除数组元素

MySQL数据类型 - JSON数据类型

如何从 MySQL 中提取 JSON 数组

mysql json字段中数值的加减