所以我正在尝试 json 列。 Mysql 8.0.17 应该可以使用多值 JSON 索引,如下所示:
CREATE INDEX data__nbr_idx ON a1( (CAST(data->'$.nbr' AS UNSIGNED ARRAY)) )
我有像这样的 JSON 列类别 [“书籍”,“衣服”]。
我需要从“书籍”类别中获取所有产品。我可以使用“json_contains”或新的“成员”。
SELECT * FROM products WHERE JSON_CONTAINS(categories, '\"books\"')
SELECT * FROM products WHERE "books" MEMBER OF(categories)
它有效。问题是 EXPLAIN 当然会显示有查询正在进行全表扫描,因此速度很慢。
所以我需要一些索引。
我通过用“char(32)”替换“unsigned”类型来更改索引示例,因为我的类别是字符串而不是数字。我在谷歌中找不到任何示例,所以我认为 char() 会很好,但事实并非如此。
这是我的索引查询:
CREATE INDEX categories_index ON products((CAST(categories AS CHAR(32) ARRAY)))
也尝试过
CREATE INDEX categories_index ON products((CAST(categories->'$' AS CHAR(32) ARRAY)))
但选择仍在进行全表扫描。我做错了什么?
如何在不使用虚拟列的情况下正确索引 json 列?
对于多值 json 索引,json 路径必须匹配,因此使用索引
CREATE INDEX categories_index
ON products((CAST(categories->'$' AS CHAR(32) ARRAY)))
您的查询还必须使用路径->'$'
(或同等的json_extract(...,'$')
)
SELECT * FROM products WHERE "books" MEMBER OF(categories->'$')
让它保持一致,它应该可以工作。
似乎没有显式路径的索引无法按预期工作,因此您必须指定->'$'
如果您想使用整个文档。这可能是一个错误,但也可能是强制转换或自动强制转换为数组的预期行为。如果您指定路径,您就会安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)