Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2017, 12:22   #1
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию Left join и group by

Всем привет!

Есть такой запрос

Код:
SELECT SQL_CALC_FOUND_ROWS  i.*,  p.CATEGORY_ID, p.MATERIAL_ID,
        FROM `agcms_filial_i` i
        LEFT JOIN `agcms_filial_p` p ON p.MATERIAL_ID = i.ID

        WHERE i.STATUS > 0 GROUP BY i.ID LIMIT 0,20
Данный запрос выполняется 7 секунд. Это катастрофически долго. Когда убираешь GROUP_BY, то запрос выполняется меньше секунды.


Значит суть в следующем. Есть таблица филиалов, 30К записей. Каждый филиал может входить в несколько категорий. Для этого была создана таблица agcms_filial_p, где прописываются связи между CATEGORY_ID И ID филиала.

Когда филиал входит в несколько категорий, то без GROUP_BY выводятся дубликаты по кол-во вхождений в категории.

Что в этом запросе не так, и как его можно оптимизировать? Может наладить какие-то связи между таблицами? На данный момент никаких связей нет, и я мало что в них понимаю.

Подскажите, пожалуйста, куда копать
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 05.03.2017, 13:25   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

p.MATERIAL_ID в списке SELECT не нужен, масло масляное, он и так там есть в виде i.ID. А зачем вообще связка с agcms_filial_p? Что бы показать одну из категорий, при чем случайным образом, в которую входит филиал? Теперь - индекс по STATUS есть? Почему ORDER BY нет коль есть LIMIT? На какую упорядоченность он нацелен?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.03.2017, 13:28   #3
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
p.MATERIAL_ID в списке SELECT не нужен, масло масляное, он и так там есть в виде i.ID. А зачем вообще связка с agcms_filial_p? Что бы показать одну из категорий, при чем случайным образом, в которую входит филиал? Теперь - индекс по STATUS есть? Почему ORDER BY нет коль есть LIMIT? На какую упорядоченность он нацелен?
Для наглядности убрал из запроса все лишнее. Вот полный запрос

Код:
SELECT SQL_CALC_FOUND_ROWS  i.*, c.*, @id:=i.ID,@gid:=i.GROUP_ID, r.*, g.LOGO AS GROUP_LOGO, p.CATEGORY_ID, p.MATERIAL_ID,
        (SELECT COUNT(*) FROM `agcms_comments` WHERE `CONTROLLER` = 'filial' AND `MATERIAL_ID` = @id) AS COMMENTS_COUNT
        FROM `agcms_filial_i` i
        LEFT JOIN `agcms_filial_p` p ON p.MATERIAL_ID = i.ID
        LEFT JOIN `agcms_city` c ON i.CITY_ID = c.CITY_ID
        LEFT JOIN `agcms_regions` r ON r.REGION_ID = c.REGION_ID
        LEFT JOIN `agcms_filial_groups` g ON g.ID = i.GROUP_ID

        WHERE i.STATUS > 0 AND p.CATEGORY_ID = 2 GROUP BY i.ID LIMIT 0,20
i.STATUS индекса нет. Там поле тип int(1)
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 05.03.2017, 13:35   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
AND p.CATEGORY_ID = 2
Зачем тогда GROUP BY? Возможно другие джоины дублируют? А индекс сделай, должно впечатлить. Отсутствие индекса означает перебор всех 30К записей
И вообще LEFT GOIN достаточно медленные соединения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.03.2017 в 13:42.
Аватар вне форума Ответить с цитированием
Старый 05.03.2017, 13:47   #5
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Зачем тогда GROUP BY?
Без GROUP BY в выдачи присутствуют дублирующиеся записи, если запись входит в несколько категорий. На это влияет

Код:
LEFT JOIN `agcms_filial_p` p ON p.MATERIAL_ID = i.ID
Цитата:
Сообщение от Аватар Посмотреть сообщение
А индекс сделай, должно впечатлить. Отсутствие индекса означает перебор всех 30К записей
Попробую. Отпишусь
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 05.03.2017, 13:51   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
На это влияет
Влияло бы, если бы не было WHERE i.STATUS > 0 AND p.CATEGORY_ID = 2. А поскольку есть, то тут LEFT и не нужен. Достаточно JOIN ON p.MATERIAL_ID = i.ID AND p.CATEGORY_ID = 2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LEFT JOIN januarist SQL, базы данных 6 23.07.2015 12:15
LEFT JOIN kuba1981 SQL, базы данных 3 21.11.2013 08:00
left join kilogram SQL, базы данных 5 14.07.2012 05:13
запрос с left join KatrinSecret SQL, базы данных 2 18.01.2012 22:31
LEFT JOIN acidcool SQL, базы данных 12 20.08.2009 19:23