Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом (тормозит) / 14 сообщений из 14, страница 1 из 1
03.07.2018, 20:22
    #39669095
fourty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Здравствуйте.

Прошу помочь с запросом из-за которого сильно грузится процессор.
SHOW FULL PROCESSLIST показывает для него состояние "Copying to tmp table"

Сам запрос (сильно не ругайте).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
    `vuzes`.`id`, `vuzes`.`name`, `vuzes`.`subj_id`, `vuzes`.`city_id`, `metros`.`name` AS metro,
    `vuzes`.`gos`, `vuzes`.`hostel`, `vuzes`.`military`, `vuzes`.`vedom`,
    `user2vuz`.`u_id`, IFNULL(b.opinions,0) AS opinions, IFNULL(s.specs, 0) AS specs,
    IF(`vuzes`.`packetEnd`>DATE(NOW()), "sert", "") AS packet, `vuzes`.`noAbitur`, `vuzes`.`ege` 
FROM 
    `vuzes` LEFT JOIN
    `specs` ON `specs`.`vuz_id` = `vuzes`.`id` LEFT JOIN
    `general`.`metros` ON `vuzes`.`metro_id`=`metros`.`id` LEFT JOIN
    `vuz`.`user2vuz` ON `user2vuz`.`vuz_id`=`vuzes`.`id` LEFT JOIN (
         SELECT `vuz_id` , count( * ) AS opinions
         FROM `vuz`.`opinions`
         GROUP BY `vuz_id`
     ) b ON b.`vuz_id` = `vuzes`.`id` LEFT JOIN (
         SELECT `vuz_id` , count(*) AS specs
         FROM `vuz`.`specs`
         GROUP BY `vuz_id`
     ) s ON s.`vuz_id` = `vuzes`.`id` 
WHERE `delReason`="" AND `vuzes`.`subj_id`=78 AND `specs`.`free`!=0 
GROUP BY `vuzes`.`id` ORDER BY `packet` DESC, `vuzes`.`rating` DESC LIMIT 0, 30;



EXPLAIN в приложении

Профилирование
авторstarting 0.000039
checking query cache for query 0.000169
Opening tables 0.000106
System lock 0.000039
Table lock 0.000154
optimizing 0.000018
statistics 0.000028
preparing 0.000030
executing 0.000027
Sorting result 0.000021
Sending data 0.000973
optimizing 0.000025
statistics 0.000031
preparing 0.000026
executing 0.000024
Sorting result 0.000022
Sending data 0.018629
init 0.000231
optimizing 0.000040
statistics 0.000599
preparing 0.000054
Creating tmp table 0.000189
executing 0.000022
Copying to tmp table 0.879500
Sorting result 0.000135
Sending data 0.000257
end 0.000021
removing tmp table 0.000093
end 0.000020
query end 0.000017
freeing items 0.002168
removing tmp table 0.000029
closing tables 0.000015
removing tmp table 0.000019
closing tables 0.000036
logging slow query 0.000014
cleaning up 0.000022

Заранее спасибо за ответ, без оскорблений)
...
Рейтинг: 0 / 0
04.07.2018, 07:38
    #39669216
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
fourtyЗаранее спасибо за ответ, без оскорбленийНу вообще-то надо бы...
Кто мешал вменяемо отформатировать код? ни хрена ж структуры запроса не видать...
Кто мешал ВСЕМ полям в запросе проставить алиасы таблиц? или хотя бы DDL таблиц показать? догадывайся теперь, где, в какой таблице, находятся поля delReason или там packet...

По сути ПОКА можно сказать лишь одно - поскольку в условиях отбора есть условие по таблице specs, то эту таблицу следует связывать INNER JOIN, а не LEFT - всё одно вырождается, а серверу работы меньше.
...
Рейтинг: 0 / 0
04.07.2018, 08:40
    #39669223
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Согласен. Не читабельно.
+ а "загрузка " зависит от количества выбираемых полей?
Может стоит попробовать по максисмуму сократить синтаксис.
Либо на этапе сокращения найдешь тормознутый элемент, либо приведешь запрос к читаемому виду.
...
Рейтинг: 0 / 0
04.07.2018, 08:49
    #39669228
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
982183"загрузка " зависит от количества выбираемых полей?Только в случае, если при небольшом количестве полей используется покрывающий индекс, а при большом идёт извлечение из таблицы.
...
Рейтинг: 0 / 0
04.07.2018, 08:52
    #39669231
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
fourty,

с учетом LIMIT-а напрашивается изменение структуры запроса. Предлагаю изначально выбрать ТОП 30 "вузов", после чего - прикрутить к ним opinions и specs. Но рассчитывать их только для выбранной тридцатки, посредством коррелированного скалярного подзапроса в списке SELECT, а не в деривед-табле и для всех "вузов"
...
Рейтинг: 0 / 0
04.07.2018, 11:01
    #39669319
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
не все поля запроса входят в аггрегаты или group by
...
Рейтинг: 0 / 0
04.07.2018, 16:16
    #39669574
fourty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Щукина Анна,

Если я вас правильно понял, то запрос теперь выглядит так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SELECT 
	v.*,
	`user2vuz`.`u_id`, `metros`.`name` AS metro, 
	IFNULL(o.opinions,0) AS opinions, IFNULL(s.specs, 0) AS specs
FROM (										
	SELECT 
		`vuzes`.`id`, `vuzes`.`name`, `vuzes`.`subj_id`, `vuzes`.`city_id`, 
        `vuzes`.`gos`, `vuzes`.`hostel`, `vuzes`.`military`, `vuzes`.`vedom`,
    	`vuzes`.`metro_id`, `vuzes`.`rating`, `vuzes`.`noAbitur`, `vuzes`.`ege`,
		IF(`vuzes`.`packetEnd`>DATE(NOW()), "sert", "") AS packet
	FROM 
		`vuzes` 
	WHERE 
		`vuzes`.`delReason`="" AND `vuzes`.`subj_id`=77 
	ORDER BY packet DESC, `vuzes`.`rating` DESC 
	LIMIT 0, 30) v LEFT JOIN 
	`user2vuz` ON `user2vuz`.`vuz_id`=v.`id` LEFT JOIN
    `specs` ON `specs`.`vuz_id` = v.`id` LEFT JOIN
    `general`.`metros` ON `metros`.`id`=v.`metro_id` LEFT JOIN (
        SELECT `vuz_id`, count(*) AS specs
        FROM `vuz`.`specs`
        GROUP BY `vuz_id`
    ) s ON s.`vuz_id` = v.`id` LEFT JOIN (
        SELECT `vuz_id`, count(*) AS opinions
        FROM `vuz`.`opinions`
        GROUP BY `vuz_id`
	) o ON o.`vuz_id` = v.`id`
WHERE `specs`.`free`!=0	
GROUP BY v.`id`
ORDER BY v.`packet` DESC, v.`rating` DESC 
...
Рейтинг: 0 / 0
04.07.2018, 16:20
    #39669579
fourty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Щукина Анна,
Прошу прощения форматирование съехало
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT 
	v.*,
	`user2vuz`.`u_id`, `metros`.`name` AS metro, 
	IFNULL(o.opinions,0) AS opinions, IFNULL(s.specs, 0) AS specs
FROM (										
	SELECT 
		`vuzes`.`id`, `vuzes`.`name`, `vuzes`.`subj_id`, `vuzes`.`city_id`, 
                `vuzes`.`gos`, `vuzes`.`hostel`, `vuzes`.`military`, `vuzes`.`vedom`,
    	        `vuzes`.`metro_id`, `vuzes`.`rating`, `vuzes`.`noAbitur`, `vuzes`.`ege`,
		IF(`vuzes`.`packetEnd`>DATE(NOW()), "sert", "") AS packet
	FROM 
		`vuzes` 
	WHERE 
		`vuzes`.`delReason`="" AND `vuzes`.`subj_id`=77 
	ORDER BY packet DESC, `vuzes`.`rating` DESC 
	LIMIT 0, 30
) v LEFT JOIN 
`user2vuz` ON `user2vuz`.`vuz_id`=v.`id` LEFT JOIN
`specs` ON `specs`.`vuz_id` = v.`id` LEFT JOIN
`general`.`metros` ON `metros`.`id`=v.`metro_id` LEFT JOIN (
       SELECT `vuz_id`, count(*) AS specs FROM `vuz`.`specs` GROUP BY `vuz_id`
) s ON s.`vuz_id` = v.`id` LEFT JOIN (
       SELECT `vuz_id`, count(*) AS opinions FROM `vuz`.`opinions` GROUP BY `vuz_id`
) o ON o.`vuz_id` = v.`id`
WHERE `specs`.`free`!=0	
GROUP BY v.`id`
ORDER BY v.`packet` DESC, v.`rating` DESC 
...
Рейтинг: 0 / 0
04.07.2018, 19:31
    #39669666
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
скорее всего тут надо менять местами
автор
Код: sql
1.
`vuzes`.`delReason`="" AND `vuzes`.`subj_id`=77


ибо subj_id оставит сколько, 1 строчку? а delReason="" сколько там?
...
Рейтинг: 0 / 0
04.07.2018, 19:38
    #39669667
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
count(*) - штука дорогая, тем более по всей таблице
может агрегировать надо или кешить
...
Рейтинг: 0 / 0
05.07.2018, 02:02
    #39669768
fourty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Большое спасибо всем за ответы. Последний запрос работает гораздо быстрее. Осталось понять как получить общее количество строк (не учитывая LIMIT). Для генерации количества кнопок пейджинга.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT 
	v.*,
	`user2vuz`.`u_id`, `metros`.`name` AS metro, 
	IFNULL(o.opinions,0) AS opinions, IFNULL(s.specs, 0) AS specs
FROM (										
	SELECT 
		`vuzes`.`id`, `vuzes`.`name`, `vuzes`.`subj_id`, `vuzes`.`city_id`, 
                `vuzes`.`gos`, `vuzes`.`hostel`, `vuzes`.`military`, `vuzes`.`vedom`,
    	        `vuzes`.`metro_id`, `vuzes`.`rating`, `vuzes`.`noAbitur`, `vuzes`.`ege`,
		IF(`vuzes`.`packetEnd`>DATE(NOW()), "sert", "") AS packet
	FROM 
		`vuzes` 
	WHERE 
		`vuzes`.`delReason`="" AND `vuzes`.`subj_id`=77 
	ORDER BY packet DESC, `vuzes`.`rating` DESC 
	LIMIT 0, 30
) v LEFT JOIN 
`user2vuz` ON `user2vuz`.`vuz_id`=v.`id` LEFT JOIN
`specs` ON `specs`.`vuz_id` = v.`id` LEFT JOIN
`general`.`metros` ON `metros`.`id`=v.`metro_id` LEFT JOIN (
       SELECT `vuz_id`, count(*) AS specs FROM `vuz`.`specs` GROUP BY `vuz_id`
) s ON s.`vuz_id` = v.`id` LEFT JOIN (
       SELECT `vuz_id`, count(*) AS opinions FROM `vuz`.`opinions` GROUP BY `vuz_id`
) o ON o.`vuz_id` = v.`id`
WHERE `specs`.`free`!=0	
GROUP BY v.`id`
ORDER BY v.`packet` DESC, v.`rating` DESC 
...
Рейтинг: 0 / 0
05.07.2018, 07:37
    #39669782
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
fourtyкак получить общее количество строк (не учитывая LIMIT).SQL_CALC_FOUND_ROWS
...
Рейтинг: 0 / 0
05.07.2018, 13:39
    #39670021
fourty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
Akina,

К сожалению, здесь это не сработает, LIMIT во вложенном запросе, результат будет всегда равен количеству выбранных срок в рамках LIMIT
...
Рейтинг: 0 / 0
05.07.2018, 13:59
    #39670033
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом (тормозит)
fourtyLIMIT во вложенном запросеВ таких условиях общее количество не получить иначе как выполнением запроса без лимитирования.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом (тормозит) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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