Страница 1 из 1
запрос в БД mysql
Добавлено: 2010-07-08 14:55:04
Andrey2009
насколько правильно использовать при запросе одновременно и left join и where?
Запрос типа такого:
Код: Выделить всё
select Alarms.Id, typeId, Alarms.Date, Time, Description, Who_reg, Channel_new.Name, Street, Home, Office,
typeName, StatusName, Id_point, Channel_new.Id, Duration, Done from Alarms left join Channel_new on Channel_new.id=Alarms.id_ch
left join StatusTypes on StatusTypes.id = Alarms.Done
left join AlarmTypes on AlarmTypes.id = Alarms.typeId where Channel_new.Name like '%$client%' or CONCAT(Channel_new.Street,' ',Channel_new.Home) like '%$client%' and Alarms.Id_ch = '$alarm_n' and Alarms.typeId = '$alarm_type'
Re: запрос в БД mysql
Добавлено: 2010-07-08 15:10:33
zg
Andrey2009 писал(а):насколько правильно использовать при запросе одновременно и left join и where?
на 100%
Andrey2009 писал(а):Запрос типа такого:
запрос нормальный, но индексы он не будет использовать.
Re: запрос в БД mysql
Добавлено: 2010-07-09 7:22:53
Andrey2009
немного недопонимаю
ON используется как раз вместо WHERE при JOIN. Вроде ведь есть разница при
Код: Выделить всё
select Alarms.Id, typeId, Alarms.Date, Time, Description, Who_reg, Channel_new.Name, Street, Home, Office,
typeName, StatusName, Id_point, Channel_new.Id, Duration, Done from Alarms left join Channel_new on Channel_new.id=Alarms.id_ch
left join StatusTypes on StatusTypes.id = Alarms.Done
left join AlarmTypes on AlarmTypes.id = Alarms.typeId where Channel_new.Name like '%$client%'
И
Код: Выделить всё
select Alarms.Id, typeId, Alarms.Date, Time, Description, Who_reg, Channel_new.Name, Street, Home, Office,
typeName, StatusName, Id_point, Channel_new.Id, Duration, Done from Alarms left join Channel_new on Channel_new.id=Alarms.id_ch
left join StatusTypes on StatusTypes.id = Alarms.Done
left join AlarmTypes on AlarmTypes.id = Alarms.typeId and Channel_new.Name like '%$client%'
в первом примере - использовал where, во втором - and.
Каким образом уживаются одновременно и ON при JOIN и WHERE?
Re: запрос в БД mysql
Добавлено: 2010-07-09 20:54:39
ProFTP
можно посмотреть какие индексы используются....
можно наполнить таблицу и смотреть логи какие запросы долго выполняются...
в mysql есть утилита для нагрузочного тестирования
Re: запрос в БД mysql
Добавлено: 2010-07-09 23:44:33
FiL
Andrey2009 писал(а):
в первом примере - использовал where, во втором - and.
Каким образом уживаются одновременно и ON при JOIN и WHERE?
ну так результаты-же разные...
Про ON ... AND .... задаются условия джойна, но результат выдаётся весь.
А при WHERE делается джойн и потом из этого джойна уже выводятся только записи удовлетворяющие условию.
Если делать inner join, то я так сразу не скажу есть-ли разница. Но с LEFT JOIN точно есть.
Re: запрос в БД mysql
Добавлено: 2010-07-12 21:01:16
LMik
Если вдуматься в работу оптимизатора - JOIN ничто иное как AND + WHERE с определенными условиями.
Re: запрос в БД mysql
Добавлено: 2010-07-19 19:29:21
zg
LMik писал(а):Если вдуматься в работу оптимизатора - JOIN ничто иное как AND + WHERE с определенными условиями.
абстрактно да, реально нет. Условия выборки по ON и по WHERE имеют разные входные данные. WHERE всегда работает с декартовым множеством объединяемых таблиц, а ON это множество ограничивает. На деле это существенно сказывается на оптимизации работы индексов и итоговой выборке.
Re: запрос в БД mysql
Добавлено: 2012-10-03 15:59:54
malor
У меня формируется табличка в
БД достаточно продолжительное время, в главном запросе, компонующем данные,
условие
WHERE упомянуто более
30 раз (столько и столбцов). Как ускорить процесс ?
Переход от использования
"WHERE" на использование
"LEFT JOIN" и
"WHERE" (прям как у
ТС в
1-м посте) решит что-нибудь ?
Цитата:
Работа с MySQL. На дорожку
"По возможности минимально используйте LEFT JOIN для объединения таблиц.
Это весьма трудоёмкая операция для базы данных."