Mysql中在json字段里存放数组时,如果需要快速查找到包含某个数字或字符串的数组,则需要在这个数组上建立索引,其`multi-valued` 索引能满足这种需求。
在已有表的情况下,执行以下语句创建一个数字数组索引:
ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->'$.指向数组的对象名' AS UNSIGNED ARRAY)));
这个语句把json字段中的一个数组以无符号数组读出,并对每个数字进行索引,这样要寻找包含某数字的数组时,将使用索引提速。
如果数组内的成员都为字符串,可以这样创建索引(要注意,该表的排序规则需为`utf8mb4_0900_as_cs`,否则会报错):
ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->'$.指向数组的对象名' AS CHAR(255) ARRAY)));
接下来使用类似这样的语句查找拥有某个数字的数组所在的条目
SELECT * FROM 表名 where 要找的数字 MEMBER OF(json字段->'$.指向数组的对象名');
或同时查找多个数字(字符串查找同理)
SELECT * FROM 表名 where JSON_CONTAINS(json字段->'$.指向数组的对象名', CAST('[1,2,3,4,5]' AS JSON));
使用了该索引后,作用在相关字段上的`JSON_OVERLAPS` 函数也会使用索引。
参考:https://dev.mysql.com/doc/refman/8.0/en/create-index.html
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。