SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.03.2011 22:28:49

VBKesha
Участник
Зарегистрирован: 21.03.2011
Сообщений: 2

Использование IN в условиях и индексы.

Есть две таблицы, в одной таблице для упрощения можно щитать есть два столбца cat_id и an_id. Из неё проиходит выборка поля an_id по условию которое затрагивает cat_id.
После этого из второй таблицы надо выбрать записи у которох поле cat_id соотвестсует выбраным an_id из первой таблицы.
По логике делаю такое

select * from depot where cat_id in (select an_id from item_codes where cat_id=171392)

В итоге получаю нежелание MySQL использовать индекс в таблице depot

Код:

 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 индексом.

Если же запрос составить так:

select * from depot, (select an_id from item_codes where cat_id=171392) as tmp where cat_id=tmp.an_id;

То с индексами всё отлично:

Код:

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 или я чтото не так делаю?

Неактивен

 

#2 22.03.2011 07:46:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Использование IN в условиях и индексы.

Это старая проблема, которую обещают исправить в 6-ой версии. Подзапрос в конструкции IN трактуется оптимизатором как зависимый. Это видно в вашем первом эксплейне (DEPENDENT SUBQUERY).
Решение - переписать запрос через JOIN, что вы и сделали.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson