Не работает Индекс при Left Join с двумя условиями

danisimo

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

Вот запрос

explain select * from cat_prices
left join partmakers on partmakers.mak_id=cat_prices.maker_id
left join dillers on id_dill=id_dop_diller or 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) так же не помогает.

Если кто-то сможет что-либо подсказать, буду благодарен.
 

2XZ

Новичок
Попробуйте использовать UNION
PHP:
select * from cat_prices 
left join partmakers on partmakers.mak_id=cat_prices.maker_id 
left join dillers on id_dill=id_dop_diller 
where cat_prices.cat_number='9091520003' and maker_id='149'
union all
select * from cat_prices 
left join partmakers on partmakers.mak_id=cat_prices.maker_id 
left join dillers on
on id_dill=diller_id 
where cat_prices.cat_number='9091520003' and maker_id='149'
 

prolis

Новичок
это из-за OR
попробуй
left join dillers on id_dill in (id_dop_diller,diller_id)
или ещё один join с этой таблицей
 
Сверху