Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает Индекс при Left Join с двумя условиями 
:(
    Опции темы
danisimo
Дата 25.6.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.9.2010
Где: Донецк

Репутация: нет
Всего: нет



Привет всем. Странную вещь заметил в explain 

Вот запрос

Цитата

explain select * from cat_prices 
left join partmakers on partmakers.mak_id=cat_prices.maker_id 
left join dillers on dillers.id_dill=id_dop_diller or dillers.id_dill=diller_id 
where cat_prices.cat_number='9091520003' and maker_id='149'



вот результат 

Цитата

id  select_type  table  type  possible_keys  key  key_len  ref  rows
1    SIMPLE    cat_prices    index_merge    maker_id_cat_number    maker_id_cat_number    152,156    NULL    11    
1    SIMPLE    partmakers    eq_ref    PRIMARY    PRIMARY    4    olimpiaauto.cat_prices.maker_id    1  
1    SIMPLE    dillers    ALL    PRIMARY,id_dill    NULL    NULL    NULL    908





То есть когда выполняется left join dillers, mysql проходится по всем 908 записям в таблице dillers, вместо того, чтобы воспользоваться индексом. Причем на каждый номер в условии where будет просмотрено 908 записей. Если номеров будет 100, то это лишние 90800 просмотров, что в итоге очень сказывается на производительности. Всё это, из-за того, что в условии on стоит 2 условия - id_dill=id_dop_diller or id_dill=diller_id . Если поставить просто id_dill=id_dop_diller или id_dill=diller_id то все хорошо, в колонке rows будет стоять 1, и ключ будет выбран, как и должно быть.

Странно еще что в possible_keys вроде есть ключи, но почему-то он не выбирает ни один из них. left join dillers use index (PRIMARY) так же не помогает.

Если кто-то сможет что-либо подсказать, буду благодарен.
PM MAIL WWW   Вверх
Akina
Дата 25.6.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



расставьте ВЕЗДЕ алиасы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
danisimo
Дата 25.6.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.9.2010
Где: Донецк

Репутация: нет
Всего: нет



Цитата

расставьте ВЕЗДЕ алиасы.


расставил

Цитата

explain select * from cat_prices cp
left join partmakers p on p.mak_id=cp.maker_id 
left join dillers d on d.id_dill=cp.id_dop_diller or d.id_dill=cp.diller_id 
where cp.cat_number='9091520003' and cp.maker_id='149'

PM MAIL WWW   Вверх
Akina
Дата 25.6.2012, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



И пожалуйста, цитируя SQL=фрагменты, используйте тег SQL-кода, а не цитаты.

Добавлено через 1 минуту и 45 секунд
Если хотите использовать индекс (OR в условии однозначно не позволит, и не пытайтесь) - разделите запрос на два, каждый со своим условием, и union их.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.