запрос в БД mysql

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Andrey2009
рядовой
Сообщения: 46
Зарегистрирован: 2009-12-01 10:43:06

запрос в БД mysql

Непрочитанное сообщение Andrey2009 » 2010-07-08 14:55:04

насколько правильно использовать при запросе одновременно и 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'

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: запрос в БД mysql

Непрочитанное сообщение zg » 2010-07-08 15:10:33

Andrey2009 писал(а):насколько правильно использовать при запросе одновременно и left join и where?
на 100%
Andrey2009 писал(а):Запрос типа такого:
запрос нормальный, но индексы он не будет использовать.

Andrey2009
рядовой
Сообщения: 46
Зарегистрирован: 2009-12-01 10:43:06

Re: запрос в БД mysql

Непрочитанное сообщение Andrey2009 » 2010-07-09 7:22:53

немного недопонимаю
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?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: запрос в БД mysql

Непрочитанное сообщение ProFTP » 2010-07-09 20:54:39

можно посмотреть какие индексы используются....

можно наполнить таблицу и смотреть логи какие запросы долго выполняются...
в mysql есть утилита для нагрузочного тестирования
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: запрос в БД mysql

Непрочитанное сообщение FiL » 2010-07-09 23:44:33

Andrey2009 писал(а): в первом примере - использовал where, во втором - and.
Каким образом уживаются одновременно и ON при JOIN и WHERE?
ну так результаты-же разные...
Про ON ... AND .... задаются условия джойна, но результат выдаётся весь.
А при WHERE делается джойн и потом из этого джойна уже выводятся только записи удовлетворяющие условию.

Если делать inner join, то я так сразу не скажу есть-ли разница. Но с LEFT JOIN точно есть.

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: запрос в БД mysql

Непрочитанное сообщение LMik » 2010-07-12 21:01:16

Если вдуматься в работу оптимизатора - JOIN ничто иное как AND + WHERE с определенными условиями.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: запрос в БД mysql

Непрочитанное сообщение zg » 2010-07-19 19:29:21

LMik писал(а):Если вдуматься в работу оптимизатора - JOIN ничто иное как AND + WHERE с определенными условиями.
абстрактно да, реально нет. Условия выборки по ON и по WHERE имеют разные входные данные. WHERE всегда работает с декартовым множеством объединяемых таблиц, а ON это множество ограничивает. На деле это существенно сказывается на оптимизации работы индексов и итоговой выборке.

malor
ефрейтор
Сообщения: 57
Зарегистрирован: 2007-07-09 20:20:25

Re: запрос в БД mysql

Непрочитанное сообщение malor » 2012-10-03 15:59:54

У меня формируется табличка в БД достаточно продолжительное время, в главном запросе, компонующем данные,
условие WHERE упомянуто более 30 раз (столько и столбцов). Как ускорить процесс ?

Переход от использования "WHERE" на использование "LEFT JOIN" и "WHERE" (прям как у ТС в 1-м посте) решит что-нибудь ?

:bn:
Цитата:
Работа с MySQL. На дорожку
"По возможности минимально используйте LEFT JOIN для объединения таблиц.
Это весьма трудоёмкая операция для базы данных."