标签归档:索引

[MySQL]在普通字符串字段中存放json数组并索引

之前有一篇文章写的是在mysql中使用json字段时为其中的数组创建索引,它有个问题就是当该字段本身存放的就是一个数组时(不放在对象下的属性中),这样创建的索引不生效,原因不明。因此要使索引生效需要把数组放在对象下的一个属性里。

现在我发现,如果想要在mysql中存放一个可以索引的json数组,其实根本不需要使用json字段,即使是普通的字符串字段存放的json数组也可以用同样的方法进行索引。

比如现在有一个字段tags,类型为mediumtext,在其中一行存放了以下字符串:

[1,2,3,4,5,6,7,8,9,10]

然后将其解析为json来创建多值索引:

ALTER TABLE 表 ADD INDEX tag_idx((cast(JSON_EXTRACT(tags, '$') as unsigned array)))

接着在查询数据时也把该字段解析为json进行使用:

SELECT *
FROM 表
WHERE JSON_OVERLAPS('[1,2]',JSON_EXTRACT(tags, '$'))

在这样的查询中,mysql就会使用到这个json数组的索引,因此如果一个数据仅仅是为了作为数组使用的话就没必要套个对象放进json字段了,使用普通字符串字段即可。

[MySQL]member of 不走索引

刚刚发现程序里有一个语句,是一个unique主键 member of(返回json数组的子查询),但它就是不走主键索引,接着我把子查询换成了一个手写的json串,像这样

SELECT
    tag_id
FROM
    tags FORCE INDEX ( tag_id_unique ) 
WHERE
    tag_id member of (JSON_EXTRACT( '[1,2,3]', '$' ))

发现即使是指定了索引也还是不走索引,可能member of就是这样的机制? 目前原因还不清楚,于是我先用了另一个办法。

继续阅读[MySQL]member of 不走索引