#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