powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Длительное выполнение group by
17 сообщений из 17, страница 1 из 1
Длительное выполнение group by
    #39352901
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть большой запрос с многими джойнами. все работает, решил я его потестировать на большой таблице и все умерло. начал искать слабое место и нашел вот что:

инфа о таблицах: projects - примерно 700к записей
users - примерно 90к записей
подзапрос отдельно исполняется около 0.4 секунды

вот собственно сам обрезок запроса о котором идет речь

select
projects.id as id,
users.username
from projects
left join users ON users.id=projects.userid
left join

(SELECT
parent_id,
sum(if(`upload_type`='EMBED_FILL',1,0)) as F2Ldocuments
FROM projects
where `upload_type`='EMBED_FILL' group by parent_id) as fill
on `projects`.`id` = `fill`.`parent_id`
where `username` != ''
group by projects.userid


если убрать group by, то запрос исполняется примерно 0.7 секунды если же добавить group by то запрос висит на протяжении 30-ти секунд и я его сам убиваю.

в чем тут соль? почему этот оператор настолько загружает и как это можна обойти? гуглил, и ничего не увидел. был бы очень благодарен, если б кто-то объяснил именно почему все виснет.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353025
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNifler,

Сколько записей возвращает запрос без группировки и с группировкой?
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353026
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по тексту запроса, этот подзапрос в принципе не нужен.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353088
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftAndriyNifler,

Сколько записей возвращает запрос без группировки и с группировкой?

без группировки около 100к, точнее скажу завтра, сейчас уже дома. с групировкой не выполняется вообще, на 30-той секунде просто я отменяю выполнение. Если убрать подзапрос, то тоже выполняет быстро, даже с группировкой, но сам подзапрос, как я уже говорил, выполняется меньше чем за секунду.

AkinaСудя по тексту запроса, этот подзапрос в принципе не нужен.

это только маленькая часть всего запроса. подзапрос мне нужен, я такими подзапросами пытаюсь уменьшить размер виртуальной таблицы главного запроса, просто получив все данные и наджоинить их.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353184
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNiflerэто только маленькая часть всего запроса. Ну так придумай АДЕКВАТНУЮ модель...
AndriyNiflerЕсли убрать подзапрос, то тоже выполняет быстро, даже с группировкой, но сам подзапрос, как я уже говорил, выполняется меньше чем за секунду. Значит, подзапрос воспринимается как коррелированный. А судя по твоей "модели", он ниачём - вот и думай, как объяснить серверу, что его надо выполнить один раз, а не для каждой записи.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353235
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как не удивительно но мне помогло) не знал такого слова как коррелированый подзапрос. это легко исправить.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353243
retvizan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЗначит, подзапрос воспринимается как коррелированный. А судя по твоей "модели", он ниачём - вот и думай, как объяснить серверу, что его надо выполнить один раз, а не для каждой записи.Так ведь подзапрос в части from. Как MySQL может воспринимать его как коррелированный?
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353247
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
retvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом.
Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353259
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftretvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом.
Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы.

Но если это так, то оно должно было б обрабатываться долго и без group by. Но без этой команды все очень быстро проделывается. Может быть так, что group by работает не с резуьтатом запроса, создавая из него новую таблицу, а постоянно сортирует и присоединяет нужные записи прямо во время составления таблицы результата? и в таком случае подзапрос будет выполняться каждый раз при создании новой строки.
не слишком ведущ в mysql, так что не сильно щемите, если то что сказал является очевидным бредом.
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353262
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNiflerЕсть большой запрос с многими джойнами. все работает, решил я его потестировать на большой таблице и все умерло. начал искать слабое место и нашел вот что:

инфа о таблицах: projects - примерно 700к записей
users - примерно 90к записей
подзапрос отдельно исполняется около 0.4 секунды

вот собственно сам обрезок запроса о котором идет речь

select
projects.id as id,
users.username
from projects
left join users ON users.id=projects.userid
left join

(SELECT
parent_id,
sum(if(`upload_type`='EMBED_FILL',1,0)) as F2Ldocuments
FROM projects
where `upload_type`='EMBED_FILL' group by parent_id) as fill
on `projects`.`id` = `fill`.`parent_id`
where `username` != ''
group by projects.userid


если убрать group by, то запрос исполняется примерно 0.7 секунды если же добавить group by то запрос висит на протяжении 30-ти секунд и я его сам убиваю.

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


...у вас база очень долго думает, а какое Project_id
надо AndriyNifler-у если случится несколько ?
над этим он думает первые 15 секунд, а потом база размышляет --
а что собствено хотел подсчитать AndriyNifler в группировке?

но через 30 секунд вы его вырубили и mysql
так и остался в непонятках...
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353263
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftretvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом.
Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы.


...кстати, в версии 5.7 добавили автоматическое (!)
динамическое построение индекса
как раз для такого случая...
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353264
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNiflermiksoftпропущено...
Я вот тоже думаю, что дело не в этом.
Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы.

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


достаточно многое можно понят применение EXPLAIN.
прогоните простой и группированый запрос через ЕКСПЛАЙН
и покажите сюда результаты...
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353491
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результаты выполнения explain:
без группировки: http://joxi.net/ZrJ0G5YtyDe32j сам запрос выполняется 0.75 секунды
с группировкой: http://joxi.net/vAWpvxKizlK5rW сам запрос выполняется "очень много" секунды
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353520
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не знал о такой команде, проблемма получаается в этом using temporary. using filesort убрать можно дописав order by null. но оно ничего по сути не дало.
теперь вопрос переходит в "как избавиться от using temporary". также не понимаю что за треш происходит с ключами, оно что, не использует ключи вообще?
и что это за userid_2 ключ?
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39353853
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNifler,


popkazhite resultat:

SHOW CREATE TABLE projects;

SHOW CREATE TABLE users;

....vozmozhno, nado dobavit' index projects.parent_id
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39354836
AndriyNifler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
parent_id действительно без индекса, когда доберусь до лида, попрошу чтобы поставил.

но походу тут придеться применять вообще другой подход.
оказывается на сервере не по 100к значений, а по 10кк и растет с невероятной скорость.
буду резать запрос на части судя по всему.

или реально так заджоинить с 4 таблиц данные, вместе с некоторыми функциами типа count, summ, if чтобы работало с такими огромными объемами данных и делало выборку хотя б за секунд 20?
...
Рейтинг: 0 / 0
Длительное выполнение group by
    #39354911
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndriyNiflerили реально так заджоинить с 4 таблиц данные, вместе с некоторыми функциами типа count, summ, if чтобы работало с такими огромными объемами данных и делало выборку хотя б за секунд 20?


....50 на 50 ... или да или нет...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Длительное выполнение group by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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