@WEBIVAN

Почему Mysql отказывается использовать индекс при вложенном подзапросе?

Собственно, если сделать запрос
SELECT * FROM `a` WHERE `id` IN(1,2,3);
то используется index PRIMARY id, но если сделать
SELECT * FROM `a` WHERE `id` IN(SELECT sub_id FROM b WHERE id>2);

то индекс вообще не используется, даже при
SELECT * FROM `a` FORCE INDEX (PRIMARY) WHERE `id` IN(SELECT sub_id FROM b WHERE id>2);

EXPLAIN возвращает:
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	a	ALL	NULL	NULL	NULL	NULL	16409490	Using where
2	DEPENDENT SUBQUERY	b	uid,id_domain_time_add,uid_2	id_domain_time_add	8	NULL	118	Using where

Почему при вложенном запросе mysql отказывается использовать индекс?
  • Вопрос задан
  • 3119 просмотров
Пригласить эксперта
Ответы на вопрос 2
Вложений подзапрос вроде как создает временную таблицу. Поэтому индексы и не работают..
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Подзапросы в MySQL оптимизируются хуже, чем соединения, зачастую независимый подзапрос трактуется как зависимый . Попробуйте так:
SELECT * 
    FROM `a`
        INNER JOIN `b` ON `b`.`sub_id` = `a`.`id`
    WHERE `b`.`id` > 2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы