powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
4 сообщений из 4, страница 1 из 1
Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
    #38471194
Alexander Mavrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При этом сервер, на котором запрос зависает на 4-5 минут, в разы мощнее по железу. На слабом сильно загруженном сервере выполняется за 2-3 секунды. Запрос не оптимальный, но переделать всё по-человечески быстро не вариант, т.к. там куча кода, который этот запрос генерит, и очень много на него всего завязано. Присоединяю файл с запросом и результатами EXPLAIN на обоих серверах.

Суть в том, что к нему джойнится около 50 таблиц, но все они джойнятся по PRIMARY KEY. Некоторые из таблиц джойнятся по первому из двух полей, входящих в PRIMARY, и содержат 3-5 значений, которые выводятся объединёнными функцией GROUP_CONCAT. При этом, EXPLAIN на серверах выглядят сильно по-разному. Насколько я знаю, в первом приближении оптимальность запроса можно оценить произведением значений в колонке rows. Так вот, для упомянутых выше таблиц, которые содержат несколько значений и объединяются GROUP_CONCAT, значение в rows на разных серверах отличается в десятки или сотни раз.
База данных одна и та же, перенесена mysqldump'ом
Версия сервера, на котором выполняется быстро: 5.1.49-3
Версия сервера, на котором выполняется медленно: 5.5.31-0+wheezy1-log

Собственно, вопрос, в чём может быть причина такой работы на медленном сервере?
Может быть существует какая-то настройка, или придётся делать даугрейд mysql до 5.1?

Код запроса (извините, целиком):
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
EXPLAIN SELECT n.*, cto.*, nr.teaser, nr.format, ctog.field_type_group_value, cf1.field_id_value, cf2.field_okrug_value,
GROUP_CONCAT(DISTINCT cf3.field_area_value ORDER BY cf3.delta SEPARATOR '^!#!^') AS field_area_value,
cf4.field_map_lat_value, cf5.field_map_lng_value,
GROUP_CONCAT(DISTINCT cf6.field_images_fid ORDER BY cf6.delta SEPARATOR '^!#!^') AS field_images_fid,
GROUP_CONCAT(DISTINCT cf6.field_images_list ORDER BY cf6.delta SEPARATOR '^!#!^') AS field_images_list,
GROUP_CONCAT(DISTINCT cf6.field_images_data ORDER BY cf6.delta SEPARATOR '^!#!^') AS field_images_data,
GROUP_CONCAT(DISTINCT cf6fi.filepath ORDER BY cf6.delta SEPARATOR '^!#!^') AS filepaths,
cf7.field_street_value, cf8.field_where_value,
GROUP_CONCAT(DISTINCT cf9.field_metro_value ORDER BY cf9.delta SEPARATOR '^!#!^') AS field_metro_value,
cf10.field_storeys_num_value,
GROUP_CONCAT(DISTINCT cf11.field_parking_value ORDER BY cf11.delta SEPARATOR '^!#!^') AS field_parking_value,
cf12.field_kpp_value,
GROUP_CONCAT(DISTINCT cf13.field_highway_value ORDER BY cf13.delta SEPARATOR '^!#!^') AS field_highway_value,
cf14.field_mkad_distance_value, cf15.field_village_name_value, cf16.field_perimeter_guard_value, cf17.field_office_class_value,
cf18.field_open_water_value, cf19.field_forest_value, cf20.field_country_value,
GROUP_CONCAT(DISTINCT cf21.field_export_xml_value ORDER BY cf21.delta SEPARATOR '^!#!^') AS field_export_xml_value,
cf22.field_gallery_style_value, cf23.field_object_class_value, ng.title AS group_title,
ng.nid AS group_nid, cfg1.field_id_value AS group_field_id_value
FROM mydb_node n
INNER JOIN mydb_node_revisions nr ON nr.vid = n.vid
INNER JOIN mydb_content_type_object cto ON cto.vid = n.vid
LEFT JOIN mydb_content_field_id cf1 ON cf1.vid = cto.vid
LEFT JOIN mydb_content_field_okrug cf2 ON cf2.vid = cto.vid
LEFT JOIN mydb_content_field_area cf3 ON cf3.vid = cto.vid
LEFT JOIN mydb_content_field_map_lat cf4 ON cf4.vid = cto.vid
LEFT JOIN mydb_content_field_map_lng cf5 ON cf5.vid = cto.vid
LEFT JOIN mydb_content_field_images cf6 ON cf6.vid = cto.vid
LEFT JOIN mydb_files cf6fi ON cf6fi.fid = cf6.field_images_fid
LEFT JOIN mydb_content_field_street cf7 ON cf7.vid = cto.vid
LEFT JOIN mydb_content_field_where cf8 ON cf8.vid = cto.vid
LEFT JOIN mydb_content_field_metro cf9 ON cf9.vid = cto.vid
LEFT JOIN mydb_content_field_storeys_num cf10 ON cf10.vid = cto.vid
LEFT JOIN mydb_content_field_parking cf11 ON cf11.vid = cto.vid
LEFT JOIN mydb_content_field_kpp cf12 ON cf12.vid = cto.vid
LEFT JOIN mydb_content_field_highway cf13 ON cf13.vid = cto.vid
LEFT JOIN mydb_content_field_mkad_distance cf14 ON cf14.vid = cto.vid
LEFT JOIN mydb_content_field_village_name cf15 ON cf15.vid = cto.vid
LEFT JOIN mydb_content_field_perimeter_guard cf16 ON cf16.vid = cto.vid
LEFT JOIN mydb_content_field_office_class cf17 ON cf17.vid = cto.vid
LEFT JOIN mydb_content_field_open_water cf18 ON cf18.vid = cto.vid
LEFT JOIN mydb_content_field_forest cf19 ON cf19.vid = cto.vid
LEFT JOIN mydb_content_field_country cf20 ON cf20.vid = cto.vid
LEFT JOIN mydb_content_field_export_xml cf21 ON cf21.vid = cto.vid
LEFT JOIN mydb_content_field_gallery_style cf22 ON cf22.vid = cto.vid
LEFT JOIN mydb_content_field_object_class cf23 ON cf23.vid = cto.vid
INNER JOIN mydb_content_field_id sf1 ON sf1.vid = cto.vid
LEFT JOIN mydb_node ng ON ng.nid = cto.field_object_group_nid
LEFT JOIN mydb_content_type_object_group ctog ON ctog.vid = ng.vid
LEFT JOIN mydb_content_field_id cfg1 ON cfg1.vid = ctog.vid
LEFT JOIN mydb_content_field_okrug cfg2 ON cfg2.vid = ctog.vid
LEFT JOIN mydb_content_field_area cfg3 ON cfg3.vid = ctog.vid
LEFT JOIN mydb_content_field_map_lat cfg4 ON cfg4.vid = ctog.vid
LEFT JOIN mydb_content_field_map_lng cfg5 ON cfg5.vid = ctog.vid
LEFT JOIN mydb_content_field_images cfg6 ON cfg6.vid = ctog.vid
LEFT JOIN mydb_files cfg6fi ON cfg6fi.fid = cfg6.field_images_fid
LEFT JOIN mydb_content_field_street cfg7 ON cfg7.vid = ctog.vid
LEFT JOIN mydb_content_field_where cfg8 ON cfg8.vid = ctog.vid
LEFT JOIN mydb_content_field_metro cfg9 ON cfg9.vid = ctog.vid
LEFT JOIN mydb_content_field_storeys_num cfg10 ON cfg10.vid = ctog.vid
LEFT JOIN mydb_content_field_parking cfg11 ON cfg11.vid = ctog.vid
LEFT JOIN mydb_content_field_kpp cfg12 ON cfg12.vid = ctog.vid
LEFT JOIN mydb_content_field_highway cfg13 ON cfg13.vid = ctog.vid
LEFT JOIN mydb_content_field_mkad_distance cfg14 ON cfg14.vid = ctog.vid
LEFT JOIN mydb_content_field_village_name cfg15 ON cfg15.vid = ctog.vid
LEFT JOIN mydb_content_field_perimeter_guard cfg16 ON cfg16.vid = ctog.vid
LEFT JOIN mydb_content_field_office_class cfg17 ON cfg17.vid = ctog.vid
LEFT JOIN mydb_content_field_open_water cfg18 ON cfg18.vid = ctog.vid
LEFT JOIN mydb_content_field_forest cfg19 ON cfg19.vid = ctog.vid
LEFT JOIN mydb_content_field_country cfg20 ON cfg20.vid = ctog.vid
LEFT JOIN mydb_content_field_gallery_style cfg21 ON cfg21.vid = ctog.vid
LEFT JOIN mydb_content_field_object_class cfg22 ON cfg22.vid = ctog.vid
WHERE (n.nid IN (0,5504,8277,8359,8339,8358,5036,6096,4675,9580,6904,9279,5773,7730,5866,7933,8408,
6360,5223,8338,5232,8336,4758,6730,8612,7865,5912,8586,9522,4678))
GROUP BY n.nid
ORDER BY n.sticky DESC, n.title



EXPLAIN на быстром сервере:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEnrange"PRIMARY/vid"PRIMARY4NULL30Using where; Using temporary; Using filesort1SIMPLEctoeq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf1eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf2eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf3refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf4eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf5eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEngeq_refPRIMARYPRIMARY4mydb.cto.field_object_group_nid1 1SIMPLEctogeq_refPRIMARYPRIMARY4mydb.ng.vid1 1SIMPLEcfg1eq_refPRIMARYPRIMARY4mydb.ctog.vid1 1SIMPLEcfg2eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg3refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcf6refPRIMARYPRIMARY4mydb.n.vid5 1SIMPLEcf6fieq_refPRIMARYPRIMARY4mydb.cf6.field_images_fid1 1SIMPLEcf7eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf8eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf9refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf10eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf11refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf12eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf13refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf14eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf15eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf16eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf17eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf18eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf19eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf20eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcfg4eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg5eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg6refPRIMARYPRIMARY4mydb.ctog.vid5 1SIMPLEcfg6fieq_refPRIMARYPRIMARY4mydb.cfg6.field_images_fid1Using index1SIMPLEcfg7eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg8eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg9refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg10eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg11refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg12eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg13refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcf21refPRIMARYPRIMARY4mydb.cto.vid3 1SIMPLEcf22eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf23eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcfg14eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg15eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg16eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg17eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg18eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg19eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg20eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg21eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg22eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEsf1eq_refPRIMARYPRIMARY4mydb.cto.vid1Using where; Using index1SIMPLEnreq_refPRIMARYPRIMARY4mydb.sf1.vid1Using where

EXPLAIN на медленном сервере:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEnrange"PRIMARY/vid"PRIMARY4NULL30Using where; Using temporary; Using filesort1SIMPLEctoeq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf1eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf2eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf3refPRIMARYPRIMARY4mydb.cto.vid73 1SIMPLEcf4eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf5eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf6refPRIMARYPRIMARY4mydb.n.vid396 1SIMPLEcf6fieq_refPRIMARYPRIMARY4mydb.cf6.field_images_fid1 1SIMPLEcf7eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf8eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf9refPRIMARYPRIMARY4mydb.cto.vid86 1SIMPLEcf10eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf11refPRIMARYPRIMARY4mydb.n.vid74 1SIMPLEcf12eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf13refPRIMARYPRIMARY4mydb.cto.vid75 1SIMPLEcf14eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf15eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf16eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf17eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf18eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf19eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEcf20eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf21refPRIMARYPRIMARY4mydb.cto.vid187 1SIMPLEcf22eq_refPRIMARYPRIMARY4mydb.n.vid1 1SIMPLEcf23eq_refPRIMARYPRIMARY4mydb.cto.vid1 1SIMPLEngeq_refPRIMARYPRIMARY4mydb.cto.field_object_group_nid1 1SIMPLEctogeq_refPRIMARYPRIMARY4mydb.ng.vid1 1SIMPLEcfg1eq_refPRIMARYPRIMARY4mydb.ctog.vid1 1SIMPLEcfg2eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg3refPRIMARYPRIMARY4mydb.ctog.vid73Using index1SIMPLEcfg4eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg5eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg6refPRIMARYPRIMARY4mydb.ctog.vid396 1SIMPLEcfg6fieq_refPRIMARYPRIMARY4mydb.cfg6.field_images_fid1Using index1SIMPLEcfg7eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg8eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg9refPRIMARYPRIMARY4mydb.ctog.vid86Using index1SIMPLEcfg10eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg11refPRIMARYPRIMARY4mydb.ctog.vid74Using index1SIMPLEcfg12eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg13refPRIMARYPRIMARY4mydb.ctog.vid75Using index1SIMPLEcfg14eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg15eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg16eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg17eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg18eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg19eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg20eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg21eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEcfg22eq_refPRIMARYPRIMARY4mydb.ctog.vid1Using index1SIMPLEsf1eq_refPRIMARYPRIMARY4mydb.cto.vid1Using where; Using index1SIMPLEnreq_refPRIMARYPRIMARY4mydb.sf1.vid1Using where
...
Рейтинг: 0 / 0
Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
    #38471214
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На "медленном" сервере для всех таблиц, у которых в плане в колонке rows число отлично от единицы, сделайте ANALYZE TABLE. После это сделайте план еще раз и сравните, изменится ли. Если сильно изменится - в студию.

Какой движок таблиц? Он точно одинаковый на обоих серверах? Конфиг MySQL насколько одинаков/различен?
...
Рейтинг: 0 / 0
Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
    #38471280
Alexander Mavrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, спасибо за ответ.

Я немного сократил запрос, локализовав проблему в двух таблицах и двух id, чтобы удобнее было смотреть:
Код: sql
1.
2.
3.
4.
5.
EXPLAIN SELECT GROUP_CONCAT(DISTINCT cf3.field_area_value ORDER BY cf3.delta SEPARATOR '^!#!^') AS field_area_value
FROM mydb_node n
LEFT JOIN mydb_content_field_area cf3 ON cf3.vid = n.vid
WHERE (n.nid IN (5504,8277))
GROUP BY cf3.nid



EXPLAIN на медленном сервере:
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEnrangePRIMARYPRIMARY4NULL2Using where; Using temporary; Using filesort1SIMPLEcf3refPRIMARYPRIMARY4mydb.n.vid73

На быстром rows=1 всегда, на медленном rows становится равно 1, если в условии указать только одно значение идентификатора, например: WHERE (n.nid IN (5504))

ANALYZE TABLE даёт status=OK, после выполнения ничего не изменилось.

Таблица на обоих серверах MyISAM, одинаковая, show create table даёт (одинаково):
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `mydb_content_field_area` (
`vid` int(10) unsigned NOT NULL DEFAULT '0',
`nid` int(10) unsigned NOT NULL DEFAULT '0',
`field_area_value` longtext, `delta` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`vid`,`delta`),
KEY `nid` (`nid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8



В конфигах на медленном стоит дефолтный my-huge.cnf из примеров.
На быстром какой-то правленный, присоединяю, но по-моему правки там несущественные, типа кодировок и т.п.
...
Рейтинг: 0 / 0
Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
    #38471288
Alexander Mavrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, после ANALYZE TABLE всё исправилось, я не туда смотрел. Большое спасибо, судя по всему, проблема решена.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Один и тот же запрос на одном сервере выполняется в сотню раз дольше, чем на другом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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