我正在尝试使用json列。Mysql 8.0.17可与多值JSON索引一起使用,如下所示:
CREATE INDEX data__nbr_idx ON a1( (CAST(data->'$.nbr' AS UNSIGNED ARRAY)) )
我有一个名为categories的列,其中包含像这样的JSON ["books", "clothes"]。 我需要获取所有“books”类别的产品。我可以使用“json_contains”或新的“member of”。
SELECT * FROM products WHERE JSON_CONTAINS(categories, '\"books\"')
SELECT * FROM products WHERE "books" MEMBER OF(categories)
它可以工作。问题是,当然会有EXPLAIN显示这些查询正在进行完整表扫描,因此它很慢。
所以我需要一些索引。
我通过将“unsigned”类型替换为“char(32)”来更改索引示例,因为我的类别是字符串而不是数字。我在谷歌上找不到任何关于此的示例,因此我认为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 列而不使用虚拟列?