MySQL: индекс в массиве JSON

#mysql #indexing

Вопрос:

У меня есть таблица со следующими данными:

 |ID.   | COUNTRY_CODES             |
|------|--------------------------|
|657041|"[""US"", ""DE""]"        |
|657045|"[""US"", ""GB"", ""IN""]"|
|657046|"[""US""]"                |
|657050|"[""US"", ""DE""]"        |
 

и следующий запрос:

 SELECT id, country_code FROM offers WHERE "US" MEMBER OF(country_codes)
 

Тем не менее, я добавил следующий индекс:

 KEY country_codes ((cast(country_codes as char(2) array)))
 

Схема таблицы:

 CREATE TABLE `offers` (
`id` int NOT NULL AUTO_INCREMENT,
`country_codes_by_target_groups` text DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `country_codes2` ((cast(`country_codes_by_target_groups` as char(2) array))),
KEY `country_codes3` ((cast(json_extract(`country_codes_by_target_groups`,_utf8mb4'$.arr') as char(2) array)))
 

) ДВИЖОК=InnoDB AUTO_INCREMENT=657081 КОДИРОВКА ПО УМОЛЧАНИЮ=utf8mb3 СОПОСТАВЛЕНИЕ=utf8_unicode_ci;

Вывод объяснения (это для разработки, но для реальных данных у меня то же самое):

 1   SIMPLE  offers      ALL                 155 100.00  Using where
 

MySQL его не использует.
Я не могу понять, что я делаю не так.

Комментарии:

1. Беги SELECT VERSION(); и расскажи нам, о чем он сообщает. Вам нужно, по крайней мере, MySQL 8.0.17, чтобы использовать функцию многозначного индекса. Более старые версии MySQL не поддерживают этот синтаксис.

2. Ваш индекс выглядит нормально и может быть использован. Может быть, есть что-то получше? Можете ли вы предоставить фактический план выполнения (добавить explain перед вашим запросом) и, возможно, описание таблицы (вывод show create table offers (вы можете удалить все столбцы, которые не имеют отношения к делу, но включить все индексы, упомянутые в выводе объяснения).

3. @BillKarwin нет, версия Mysql 8.0.23

4. Другая идея: MySQL обычно не использует индекс, если чувствует, что значение, которое вы ищете, очень часто встречается в вашей таблице. Нет никакого преимущества для индекса, если сканирование таблицы даст тот же результат менее дорогостоящим способом.

5. Я подозреваю, что проблема, возможно, в типе колонки — text вероятно, это должно быть json