Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! Подскажите пожалуйста! Есть таблица со связью многие ко многим, там хранится связь между продуктами и категориями.
CREATE TABLE `category_products` (
`category_id` int(10) unsigned NOT NULL,
`product_id` int(10) unsigned NOT NULL,
UNIQUE KEY `product_id` (`product_id`,`category_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `category_products_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE,
CONSTRAINT `category_products_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT
Прив выполнении простенького запроса с distinct
Неактивен
Потому что вы делаете неявную группировку по category_id. ИМХО, никак не поправить.
Неактивен
vasya написал:
Потому что вы делаете неявную группировку по category_id. ИМХО, никак не поправить.
Простите, не могли бы вы объяснить что значит не явная группировка?
Неактивен
Что значит "поправить"? Использование временной таблицы вообще-то ошибкой не является.
Вообще temporary возникает из-за неявной группировки (distinct). Как вариант - можно использовать явную группировку, тем паче у Вас уже и ключик на это создан подходящий.
Но в данном случае MySQL мог бы полностью использовать ключ `product_id`(`product_id`,`category_id`), но range на product_id ( IN даёт тот же эффект, что и range ) не позволяет использовать вторую половинку индекса.
Запрос SELECT category_id FROM t_6222 WHERE product_id = 100 group by category_id; показывает explain без temporary - Using where; Using index
и индекс используется полностью.
Так что сделайте через union - что-то вроде
Неактивен
Т.е. из-за типа связывания range используется только поле "product_id", составного ключа "product_id"?
Подскажите ещё пожалуйста, как узнать какие поля составного ключа используются?
Неактивен
Смотрите на значение колонки key_len
В вашем случае 4 значит используется только первая часть.
`product_id` int(10) unsigned NOT NULL, как раз требует 4 байта для хранения.
Если бы индекс использовался полностью, то было бы 8
Неактивен
Спасибо всем!!!
Неактивен