Задавайте вопросы, мы ответим
Вы не зашли.
Есть две таблицы, в одной таблице для упрощения можно щитать есть два столбца cat_id и an_id. Из неё проиходит выборка поля an_id по условию которое затрагивает cat_id.
После этого из второй таблицы надо выбрать записи у которох поле cat_id соотвестсует выбраным an_id из первой таблицы.
По логике делаю такое
explain select * from depot where cat_id in (select an_id from item_codes where cat_id=171392); +----+--------------------+------------+------+-----------------+--------+---------+-------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+------------+------+-----------------+--------+---------+-------+--------+-------------+ | 1 | PRIMARY | depot | ALL | NULL | NULL | NULL | NULL | 379641 | Using where | | 2 | DEPENDENT SUBQUERY | item_codes | ref | idx_anid,cat_id | cat_id | 4 | const | 2 | Using where | +----+--------------------+------------+------+-----------------+--------+---------+-------+--------+-------------+
Поле cat_id в таблие depot является primary индексом.
Если же запрос составить так:
explain select * from depot, (select an_id from item_codes where cat_id=171392) as tmp where cat_id=tmp.an_id; +----+-------------+------------+--------+---------------+---------+---------+-----------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+---------------+---------+---------+-----------+------+-------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 3 | | | 1 | PRIMARY | depot | eq_ref | PRIMARY | PRIMARY | 4 | tmp.an_id | 1 | | | 2 | DERIVED | item_codes | ref | cat_id | cat_id | 4 | | 2 | | +----+-------------+------------+--------+---------------+---------+---------+-----------+------+-------+
Вопрос это враждённая проблема IN или я чтото не так делаю?
Неактивен
Это старая проблема, которую обещают исправить в 6-ой версии. Подзапрос в конструкции IN трактуется оптимизатором как зависимый. Это видно в вашем первом эксплейне (DEPENDENT SUBQUERY).
Решение - переписать запрос через JOIN, что вы и сделали.
Неактивен