powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом (тормозит)
14 сообщений из 14, страница 1 из 1
Помогите с запросом (тормозит)
    #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
Помогите с запросом (тормозит)
    #39669216
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fourtyЗаранее спасибо за ответ, без оскорбленийНу вообще-то надо бы...
Кто мешал вменяемо отформатировать код? ни хрена ж структуры запроса не видать...
Кто мешал ВСЕМ полям в запросе проставить алиасы таблиц? или хотя бы DDL таблиц показать? догадывайся теперь, где, в какой таблице, находятся поля delReason или там packet...

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

с учетом LIMIT-а напрашивается изменение структуры запроса. Предлагаю изначально выбрать ТОП 30 "вузов", после чего - прикрутить к ним opinions и specs. Но рассчитывать их только для выбранной тридцатки, посредством коррелированного скалярного подзапроса в списке SELECT, а не в деривед-табле и для всех "вузов"
...
Рейтинг: 0 / 0
Помогите с запросом (тормозит)
    #39669319
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не все поля запроса входят в аггрегаты или group by
...
Рейтинг: 0 / 0
Помогите с запросом (тормозит)
    #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
Помогите с запросом (тормозит)
    #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
Помогите с запросом (тормозит)
    #39669666
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее всего тут надо менять местами
автор
Код: sql
1.
`vuzes`.`delReason`="" AND `vuzes`.`subj_id`=77


ибо subj_id оставит сколько, 1 строчку? а delReason="" сколько там?
...
Рейтинг: 0 / 0
Помогите с запросом (тормозит)
    #39669667
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
count(*) - штука дорогая, тем более по всей таблице
может агрегировать надо или кешить
...
Рейтинг: 0 / 0
Помогите с запросом (тормозит)
    #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
Помогите с запросом (тормозит)
    #39669782
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fourtyкак получить общее количество строк (не учитывая LIMIT).SQL_CALC_FOUND_ROWS
...
Рейтинг: 0 / 0
Помогите с запросом (тормозит)
    #39670021
fourty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

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


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