Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
Есть большой запрос с многими джойнами. все работает, решил я его потестировать на большой таблице и все умерло. начал искать слабое место и нашел вот что: инфа о таблицах: 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-ти секунд и я его сам убиваю. в чем тут соль? почему этот оператор настолько загружает и как это можна обойти? гуглил, и ничего не увидел. был бы очень благодарен, если б кто-то объяснил именно почему все виснет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 17:20 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AndriyNifler, Сколько записей возвращает запрос без группировки и с группировкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 19:36 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
Судя по тексту запроса, этот подзапрос в принципе не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 19:36 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
miksoftAndriyNifler, Сколько записей возвращает запрос без группировки и с группировкой? без группировки около 100к, точнее скажу завтра, сейчас уже дома. с групировкой не выполняется вообще, на 30-той секунде просто я отменяю выполнение. Если убрать подзапрос, то тоже выполняет быстро, даже с группировкой, но сам подзапрос, как я уже говорил, выполняется меньше чем за секунду. AkinaСудя по тексту запроса, этот подзапрос в принципе не нужен. это только маленькая часть всего запроса. подзапрос мне нужен, я такими подзапросами пытаюсь уменьшить размер виртуальной таблицы главного запроса, просто получив все данные и наджоинить их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 21:52 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AndriyNiflerэто только маленькая часть всего запроса. Ну так придумай АДЕКВАТНУЮ модель... AndriyNiflerЕсли убрать подзапрос, то тоже выполняет быстро, даже с группировкой, но сам подзапрос, как я уже говорил, выполняется меньше чем за секунду. Значит, подзапрос воспринимается как коррелированный. А судя по твоей "модели", он ниачём - вот и думай, как объяснить серверу, что его надо выполнить один раз, а не для каждой записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 23:21 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
как не удивительно но мне помогло) не знал такого слова как коррелированый подзапрос. это легко исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 00:50 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AkinaЗначит, подзапрос воспринимается как коррелированный. А судя по твоей "модели", он ниачём - вот и думай, как объяснить серверу, что его надо выполнить один раз, а не для каждой записи.Так ведь подзапрос в части from. Как MySQL может воспринимать его как коррелированный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 01:13 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
retvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом. Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 01:23 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
miksoftretvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом. Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы. Но если это так, то оно должно было б обрабатываться долго и без group by. Но без этой команды все очень быстро проделывается. Может быть так, что group by работает не с резуьтатом запроса, создавая из него новую таблицу, а постоянно сортирует и присоединяет нужные записи прямо во время составления таблицы результата? и в таком случае подзапрос будет выполняться каждый раз при создании новой строки. не слишком ведущ в mysql, так что не сильно щемите, если то что сказал является очевидным бредом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 01:57 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
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 так и остался в непонятках... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 03:02 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
miksoftretvizanКак MySQL может воспринимать его как коррелированный?Я вот тоже думаю, что дело не в этом. Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы. ...кстати, в версии 5.7 добавили автоматическое (!) динамическое построение индекса как раз для такого случая... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 03:04 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AndriyNiflermiksoftпропущено... Я вот тоже думаю, что дело не в этом. Скорее в том, что он материализируется во временную таблицу, но индекса по ней нету. И он стоит в правой части LEFT JOIN-а, т.е. не может быть ведущим. Т.е. проверка каждой записи требует полного сканирования временной таблицы. Но если это так, то оно должно было б обрабатываться долго и без group by. Но без этой команды все очень быстро проделывается. Может быть так, что group by работает не с резуьтатом запроса, создавая из него новую таблицу, а постоянно сортирует и присоединяет нужные записи прямо во время составления таблицы результата? и в таком случае подзапрос будет выполняться каждый раз при создании новой строки. не слишком ведущ в mysql, так что не сильно щемите, если то что сказал является очевидным бредом. достаточно многое можно понят применение EXPLAIN. прогоните простой и группированый запрос через ЕКСПЛАЙН и покажите сюда результаты... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 03:06 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
Результаты выполнения explain: без группировки: http://joxi.net/ZrJ0G5YtyDe32j сам запрос выполняется 0.75 секунды с группировкой: http://joxi.net/vAWpvxKizlK5rW сам запрос выполняется "очень много" секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 11:39 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
не знал о такой команде, проблемма получаается в этом using temporary. using filesort убрать можно дописав order by null. но оно ничего по сути не дало. теперь вопрос переходит в "как избавиться от using temporary". также не понимаю что за треш происходит с ключами, оно что, не использует ключи вообще? и что это за userid_2 ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 12:15 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AndriyNifler, popkazhite resultat: SHOW CREATE TABLE projects; SHOW CREATE TABLE users; ....vozmozhno, nado dobavit' index projects.parent_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 16:22 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
parent_id действительно без индекса, когда доберусь до лида, попрошу чтобы поставил. но походу тут придеться применять вообще другой подход. оказывается на сервере не по 100к значений, а по 10кк и растет с невероятной скорость. буду резать запрос на части судя по всему. или реально так заджоинить с 4 таблиц данные, вместе с некоторыми функциами типа count, summ, if чтобы работало с такими огромными объемами данных и делало выборку хотя б за секунд 20? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 20:01 |
|
||
|
Длительное выполнение group by
|
|||
|---|---|---|---|
|
#18+
AndriyNiflerили реально так заджоинить с 4 таблиц данные, вместе с некоторыми функциами типа count, summ, if чтобы работало с такими огромными объемами данных и делало выборку хотя б за секунд 20? ....50 на 50 ... или да или нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 03:40 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39353243&tid=1831159]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 354ms |

| 0 / 0 |
