powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос в несколько простых
5 сообщений из 5, страница 1 из 1
Сложный запрос в несколько простых
    #38694845
andreysss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Прошу помочь. Не получается переделать сложный запрос с тремя LEFT JOIN в несколько простых. Суть в том, что группирование кушает много ресурсов, на столько много, что выборка из 115 тыс записей делается более 3 секунд и съедает все ресурсы. Если группировку убрать, то запрос проходит за 0,15 сек. Но без группировки нельзя в данном запросе. Если использовать несколько простых подзапросов, то можно избавиться от GROUP by. Предполагаю для этого нужно сделать подзапрос jb_photo с LIMIT 1. Сколько не пытался оформить в несколько простых, ничего не вышло. Да впринципе с группировкой разберусь, главное как то всё это переделать в простые запросы. Union all не получилось сделать, т.к. количество столбцов различается (так пишет мускуль).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT jb_board.id AS board_id, jb_board.url_mess, jb_board.id_category, jb_board.type, jb_board.title, jb_board.price, jb_board.city, DATE_FORMAT(jb_board.date_add,'%d.%m.%Y') AS dateAdd, jb_board.checkbox_top, jb_board.checkbox_select, jb_board_cat.id, jb_board_cat.name_cat, jb_board_cat.en_name_cat, jb_photo.photo_name, jb_city.city_name, jb_city.en_city_name 
FROM jb_board 
LEFT JOIN jb_board_cat ON jb_board.id_category = jb_board_cat.id 
LEFT JOIN jb_city ON jb_board.city_id = jb_city.id 
LEFT JOIN jb_photo ON jb_board.id = jb_photo.id_message 
WHERE jb_board_cat.id IN  (383,384)   
AND jb_board.mes_disable ='1'  
GROUP by board_id 
ORDER BY jb_board.checkbox_top DESC, jb_board.top_time DESC, jb_board.id DESC LIMIT 0, 25
...
Рейтинг: 0 / 0
Сложный запрос в несколько простых
    #38694886
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreysssВсем привет. Прошу помочь. Не получается переделать сложный запрос с тремя LEFT JOIN в несколько простых. Суть в том, что группирование кушает много ресурсов, на столько много, что выборка из 115 тыс записей делается более 3 секунд и съедает все ресурсы. Если группировку убрать, то запрос проходит за 0,15 сек. Но без группировки нельзя в данном запросе. Если использовать несколько простых подзапросов, то можно избавиться от GROUP by. Предполагаю для этого нужно сделать подзапрос jb_photo с LIMIT 1. Сколько не пытался оформить в несколько простых, ничего не вышло. Да впринципе с группировкой разберусь, главное как то всё это переделать в простые запросы. Union all не получилось сделать, т.к. количество столбцов различается (так пишет мускуль).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT jb_board.id AS board_id, jb_board.url_mess, jb_board.id_category, jb_board.type, jb_board.title, jb_board.price, jb_board.city, DATE_FORMAT(jb_board.date_add,'%d.%m.%Y') AS dateAdd, jb_board.checkbox_top, jb_board.checkbox_select, jb_board_cat.id, jb_board_cat.name_cat, jb_board_cat.en_name_cat, jb_photo.photo_name, jb_city.city_name, jb_city.en_city_name 
FROM jb_board 
LEFT JOIN jb_board_cat ON jb_board.id_category = jb_board_cat.id 
LEFT JOIN jb_city ON jb_board.city_id = jb_city.id 
LEFT JOIN jb_photo ON jb_board.id = jb_photo.id_message 
WHERE jb_board_cat.id IN  (383,384)   
AND jb_board.mes_disable ='1'  
GROUP by board_id 
ORDER BY jb_board.checkbox_top DESC, jb_board.top_time DESC, jb_board.id DESC LIMIT 0, 25



Дык а что тут думать!!!!

у тебя есть запрос

запрос(0.15сек) + джоин картинок, которых дофига, и групировка что осталась одна случайная

переделываешь в

1)
select *
from
(запрос 0.15 сек)t left join photos ..... group by Для того чтоб по одной фотке
---думаю самый худший вариант

2)
--полудше

select *, (select photo_name from photos where Foreign_key = t.id)

from (select 0.15) t

3)
--возможно быстрей всего получиться
1 select 0.15
построить список айдишников
2 запросом найти select foreignkey,photo_ name from photos where foreignkey IN (1,2,3 .. 20)

раз данных много, то пытаться получать для каждого айди по 10-50 фоток и пытом отсеивать...здаёться мне это тупиковым путём

ити надо именно в сторону , дабы сразу не получать лишнего....
...
Рейтинг: 0 / 0
Сложный запрос в несколько простых
    #38694947
andreysss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

Спасибо за ответ. Буду пытаться всё это реализовать.
...
Рейтинг: 0 / 0
Сложный запрос в несколько простых
    #38694954
andreysss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,

Я так понимаю, в данном случае у меня идет JOIN по всей таблице после выборки WHERE jb_board_cat.id IN (383,384)
AND jb_board.mes_disable ='1' . Или группировка. Т.е. LIMIT 25 это лишь вывод после JOIN, когда все таблицы после выборки просканируются идет join. Т.к. замедление тем больше, чем больше ID относятся к каждой jb_board_cat.id. Выходит что мне подходит более 3 вариант предложенный вами. Сначала выстроить все ID WHERE jb_board_cat.id IN (383,384) с лимтом 25, а потом уже доставать по 1 фото из этих 25. Вот не пойму.. будет 25 запросов или можно обойтись одним типа IN (1,2,3....25). Представление есть, а додуматься не могу. Еще новичок.
...
Рейтинг: 0 / 0
Сложный запрос в несколько простых
    #38695152
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreysss,

обработка склю запроса

FROM -определение источника данніх
WHERE -фильрация
SELECT выбор нужной части данных

GROUP BY + агрегаты(агр-ие ф-ии) секции селект
HAVING +фидбьо плсде шоупиолвки
ORDER BY сортировка

последние три - это подготовка выдачи результата, данные идут на выход по мере
готовности. понятное дело что если сортировка без индекса пойдёт, то навыход пойдут данные
только после полной сортировки

если есть переменные, то они обрабатываються на последнем этапе


====
вкачестве оптимизации, какойто отдельный шаг, может поддымться вверх по списку
но не в низ

пример класика жангра

select * from t1,t2 where t1.id=t2.id
в лоб, это надо умножить две таблицы, и из полученой тоны записей отобрать по секции веар
реально, оптимизатор оптимизирует, что будет идентично джоину, и выборка будет идти
полная из меньшей таблицы, а из большей по индексу(если есть) только нужных записей.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос в несколько простых
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]