Индексирование JSON столбец в MySQL 8 - PullRequest
0 голосов
/ 04 апреля 2020

Итак, я экспериментирую с колонкой json. Mysql 8.0.17 должен работать с индексами с несколькими значениями JSON, например:

CREATE INDEX data__nbr_idx ON a1( (CAST(data->'$.nbr' AS UNSIGNED ARRAY)) )

У меня есть категории столбцов с JSON, как это ["books", "одежда"]. Мне нужно получить все товары из категории "книги". Я могу использовать "json_contains" или новый "member".

SELECT * FROM products WHERE JSON_CONTAINS(categories, '\"books\"')
SELECT * FROM products WHERE "books" MEMBER OF(categories)

И это работает. Проблема в том, что, конечно, EXPLAIN покажет, что запросы выполняют полное сканирование таблицы, и из-за этого он медленный.

Поэтому мне нужен какой-то индекс.

Я изменил пример индекса, заменив его Тип "unsigned" с "char (32), так как мои категории - строки, а не числа. Я не могу найти никакого примера для этого в Google, поэтому я предположил, что 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 без использования виртуальные столбцы?

1 Ответ

1 голос
/ 05 апреля 2020

Для многозначного индекса json пути json должны совпадать, поэтому с индексом

CREATE INDEX categories_index 
ON products((CAST(categories->'$' AS CHAR(32) ARRAY)))

ваш запрос должен также использовать путь ->'$' (или эквивалентный ему) json_extract(...,'$'))

SELECT * FROM products WHERE "books" MEMBER OF(categories->'$')

Сделайте его непротиворечивым, и он должен работать.

Кажется, что индекс без явного пути не работает должным образом, поэтому вы должны указать ->'$' если вы хотите использовать весь документ. Это, вероятно, ошибка, но также может быть предполагаемое поведение приведения или автоматического вещания в массив. Если вы укажете путь, вы будете в безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...