SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.02.2014 22:44:37

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Медленно отрабатывает запрос

Здравствуйте, требуется помощь с медленно работающим запросов.
Дано:
CMS система UmiCMS.
СУБД - mysql 5.1.x
База - объектно-ориентированная. Innodb.
Запросы конструируются самой системой и изменению не подлежат.

Система крутится на VPS. Оперативки выделено до 12Гб.

Запрос:


SELECT DISTINCT
SQL_CALC_FOUND_ROWS o.id AS id, o.name AS name, o.type_id AS type_id, o.is_locked AS is_locked, o.owner_id AS owner_id, o.guid AS guid, t.guid AS type_guid
FROM cms3_object_types t, cms3_object_content o_asteriks, cms3_objects o
LEFT JOIN cms3_object_content oc_235_lj ON oc_235_lj.obj_id = o.id
AND oc_235_lj.field_id =  '235'
LEFT JOIN cms3_object_content oc_230_lj ON oc_230_lj.obj_id = o.id
AND oc_230_lj.field_id =  '230'
WHERE o.type_id
IN ( 79 )
AND t.id = o.type_id
AND (
oc_230_lj.rel_val IS NOT NULL
)
AND (
o.name !=  'dummy'
OR o.name IS NULL
)
AND (
(
o_asteriks.obj_id = o.id
AND (
o_asteriks.varchar_val LIKE  '%%12839%%'
OR o_asteriks.text_val LIKE  '%%12839%%'
OR o.name LIKE  '%%12839%%'
)
)
)
ORDER BY oc_235_lj.int_val DESC
LIMIT 0 , 20
 


План выполнения (скриншот из phpMyAdmin):
http://i.imgur.com/Br3OiiJ.png

Это запрос на поиск заказа с указанным номер. Выполняется от 6 до 10 секунд.

Менеджеры воют, аки белуги. Работать при такой скорости просто невозможно. Плюс все это лихо грузит сервер.
Прошу помочь найти, что именно надо поправить. То-ли конфиг СУБД, то-ли индексы добавить.

Неактивен

 

#2 11.02.2014 23:02:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

Покажите структуру таблиц, т.е. результат
show table cms3_object_types;
и так для всех 5ти таблиц из запроса


И ещё SHOW VARIABLES;

Неактивен

 

#3 11.02.2014 23:18:54

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

vasya написал:

Покажите структуру таблиц, т.е. результат
show table cms3_object_types;
и так для всех 5ти таблиц из запроса

И ещё SHOW VARIABLES;

Таблиц на самом деле задействовано 3. Только cms3_object_content джоинится сама на себя пару раз с разными алиасами. Это ради выборки по нужным полям. Алиасы как раз обозваны в соответствии с id необходимых полей.

cms3_object_types
http://i.imgur.com/lXCNNjw.png

cms3_object_content
http://i.imgur.com/9m7egJ8.png

cms3_objects
http://i.imgur.com/C5ANp9o.png

Вывод show variables во вложенном txt файле. А то он шибко большой, а как спрятать что-то не нашел.


Прикрепленные файлы:
Attachment Icon show_variables.txt, Размер: 6,983 байт, Скачано: 927

Неактивен

 

#4 12.02.2014 00:00:49

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Не менять запрос - серьезное ограничение, но чтобы понять причину попробуйте сделать так:
1) убрать DISTINCT
2) поочередно выкидывайте JOIN внешних таблиц (кроме o) и смотрите после какого выбрасывания запрос ускорится.
3) сделайте профайлинг запроса

По конфигу:
innodb_buffer_pool_size должен быть меньше объема памяти. Сделайте, например, 6Гигов

Неактивен

 

#5 12.02.2014 00:15:56

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

По Вашим рекомендациям - завтра попробую и отпишусь.
innodb_buffer_pool_size у меня меня итак меньше. Оперативной памяти на VPS 16Гб. Или должно быть ещё меньше?

Неактивен

 

#6 12.02.2014 00:21:09

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

Нет, в этом случае уменьшать не надо. Просто от первого поста было впечатление, что её всего 12.

Неактивен

 

#7 12.02.2014 10:56:54

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

rgbeast написал:

Не менять запрос - серьезное ограничение, но чтобы понять причину попробуйте сделать так:
1) убрать DISTINCT
2) поочередно выкидывайте JOIN внешних таблиц (кроме o) и смотрите после какого выбрасывания запрос ускорится.
3) сделайте профайлинг запроса

Странно, но удаление join'ов не помогает. А вот помогает, если избавиться от cms3_object_content o_asteriks, и заменить
o_asteriks.varchar_val LIKE  '%%12839%%' на к примеру oc_230_lj.varchar_val LIKE  '%%12839%%'

По логике получается тоже самое, но при этом избавляемся от включения в запрос cms3_object_content в полном составе, который затем все равно будет "обрезан" из-за "левых" join'ов по полям. Или я не прав по поводу join'ов. Я просто откровенно не силен в sql.

Вывод профайлинга:
http://i.imgur.com/e1W869j.png

Неактивен

 

#8 12.02.2014 11:57:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Очень хорошо. Не до конца понятно почему copying to tmp table занимает основное время, но понятна связь с o_asteriks. Скорее всего из-за условия o_asteriks.text_val LIKE '...', полный текст попадает в таблицу, которая потом сортируется. Может быть, возможно избавиться от условия на полный текст в рамках текущей CMS?

Неактивен

 

#9 12.02.2014 12:04:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

Имхо, "copying to tmp table" включает в себя и группировку. Теоретически может помочь переход на более поздние версии, где временные таблицы создаются с hash индексом.

o_asteriks вообще в запросе не нужна. Перенеся условие на oc_230_lj за счет oc_230_lj.field_id =  '230' мы получим всего 1 строку, т.е. временная таблица будет меньше почти в 10 раз. Отсюда и ускорение.

Неактивен

 

#10 12.02.2014 12:08:42

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

rgbeast написал:

Очень хорошо. Не до конца понятно почему copying to tmp table занимает основное время, но понятна связь с o_asteriks. Скорее всего из-за условия o_asteriks.text_val LIKE '...', полный текст попадает в таблицу, которая потом сортируется. Может быть, возможно избавиться от условия на полный текст в рамках текущей CMS?

К сожалению нет. Запросы конструируются специальным php классом. Его изменение во первых может непонятно как отразиться на построении других запросов, а во вторых лишает меня поддержки и гарантии на систему, так как это внесение изменений в исходный код приложения (cms коммерческая).

vasya написал:

Имхо, "copying to tmp table" включает в себя и группировку. Теоретически может помочь переход на более поздние версии, где временные таблицы создаются с hash индексом.

o_asteriks вообще в запросе не нужна. Перенеся условие на oc_230_lj за счет oc_230_lj.field_id =  '230' мы получим всего 1 строку, т.е. временная таблица будет меньше почти в 10 раз. Отсюда и ускорение.

Вот и я примерно так понял, когда анализировал запрос. Есть мысль: раз нельзя исправить запрос, то может попробовать увеличить скорость copying to tmp table путем переноса на tmpfs (начитался тут пытаясь разобраться)? Временные таблицы ведь создаются на физическом диске, правильно я понимаю?

Неактивен

 

#11 12.02.2014 12:11:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

Нет в оперативной, если не превышают max_heap_table_size и tmp_table_size и хватает памяти.
Можно проверить через show status

Неактивен

 

#12 12.02.2014 12:15:41

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

vasya написал:

Нет в оперативной, если не превышают max_heap_table_size и tmp_table_size и хватает памяти.
Можно проверить через show status

Каким это проверить? Что именно надо смотреть?

Неактивен

 

#13 12.02.2014 12:20:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

http://dev.mysql.com/doc/refman/5.6/en/ … ables.html

переменные
Created_tmp_disk_tables           
Created_tmp_tables

Неактивен

 

#14 12.02.2014 12:35:49

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Насколько я знаю, UmiCMS достаточно гибкая система. 6 секунд на запрос - это разве не гарантийный случай? Думаю, что техподдержка должна сделать для вас необходимые модификации (тем более вы знаете в чем дело - нужно исключить поиск по полному тексту). Сам на практике с Umi не сталкивался, но это как раз характеризует систему положительно - значит ваш случай скорее исключение.

По конфигурации - мало шансов на успех, но попробовать стоит. Приведите:

SHOW GLOBAL VARIABLES LIKE '%table_size';
SHOW GLOBAL STATUS LIKE 'Created_tmp%';

Неактивен

 

#15 12.02.2014 12:43:49

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

rgbeast написал:

Насколько я знаю, UmiCMS достаточно гибкая система. 6 секунд на запрос - это разве не гарантийный случай? Думаю, что техподдержка должна сделать для вас необходимые модификации (тем более вы знаете в чем дело - нужно исключить поиск по полному тексту). Сам на практике с Umi не сталкивался, но это как раз характеризует систему положительно - значит ваш случай скорее исключение.

По конфигурации - мало шансов на успех, но попробовать стоит. Приведите:

SHOW GLOBAL VARIABLES LIKE '%table_size';
SHOW GLOBAL STATUS LIKE 'Created_tmp%';

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

mysql> SHOW GLOBAL VARIABLES LIKE '%table_size';
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 268435456 |
| tmp_table_size      | 268435456 |
+---------------------+-----------+


mysql> SHOW GLOBAL STATUS LIKE 'Created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 48    |
| Created_tmp_files       | 5     |
| Created_tmp_tables      | 4794  |
+-------------------------+-------+

Неактивен

 

#16 12.02.2014 12:53:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

@rБУzzz написал:

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

Наши люди везде найдут выход smile
Можно сделать заплатку после того как запрос сконструирован, но перед отправкой в базу. И регулярным выражением его: если вид такой, то меняем на другой. Это не изменит остальные запросы и не сильно помешает вам обновлять систему.
Перед обращением за гарантией, уберете заплатку smile
Жесть конечно, но может и помочь.


Со стороны MySQL можно лишь расчитывать на некоторое ускорение в версиях где временная таблица создается с hash индексом.

Неактивен

 

#17 12.02.2014 12:55:51

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

vasya написал:

@rБУzzz написал:

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

Наши люди везде найдут выход smile
Можно сделать заплатку после того как запрос сконструирован, но перед отправкой в базу. И регулярным выражением его: если вид такой, то меняем на другой. Это не изменит остальные запросы и не сильно помешает вам обновлять систему.
Перед обращением за гарантией, уберете заплатку smile
Жесть конечно, но может и помочь.


Со стороны MySQL можно лишь расчитывать на некоторое ускорение в версиях где временная таблица создается с hash индексом.

Хм... Можно конечно попробовать, но что-то не уверен. Запрос выполняется из админ зоны, а это отдельная песня...

Начиная с какой версии временные таблицы идут с hash индексом?

Неактивен

 

#18 12.02.2014 13:09:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

MySQL 5.6 / MariaDB 5.5
Но в доке сказано про временную таблицу из from-подзапроса. По идее эта оптимизация должна быть доступна и в остальных случаях, но нужно проверять.

Неактивен

 

#19 12.02.2014 13:44:26

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Таблицы у вас создаются в основном не на диске, значит конфигурацией не исправить.

Технически, кажется, что не обязательно менять сам класс, который обращается к базе, а можно поменять условия с которыми он вызывается в админке (обычно достаточно изменить один файл).

Неактивен

 

#20 12.02.2014 13:47:55

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

vasya написал:

MySQL 5.6 / MariaDB 5.5
Но в доке сказано про временную таблицу из from-подзапроса. По идее эта оптимизация должна быть доступна и в остальных случаях, но нужно проверять.

В общем ясно, что без изменения формируемого запроса обойтись не получится. Посмотрю можно ли обновить СУБД до более свежей версии. Спасибо Вам большое за помощь и участие.

Неактивен

 

#21 12.02.2014 16:51:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5

Ответили, что предложенное решение вас устроило

Неактивен

 

#22 12.02.2014 17:00:12

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

rgbeast написал:

Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5

Ответили, что решение вас устроило

Да, пока я тут пытался решить проблему по сложному, они мне объяснили, что просто я не в том поле ищу по номеру заказа.
Мне мои менеджеры настолько вынесли мозг, что я не разобравшись, что именно и куда они вбивают, полез сразу в недра системы. По факту есть отдельное поле для номера заказа, поле куда они вбивали номер - предназначено для общего поиска по содержимому всех полей всех заказов. Именно поэтому там такой большой запрос и такой медленный.
Ту инфу, что удалось накопать в процессе поиска, я им продублировал, возможно это поможет как откорректировать логику конструктора запросов.

Очень удивился, что в они так оперативно реагируют в Facebook. Может лучше писать туда, а не в техподдержку smile

Неактивен

 

#23 12.02.2014 17:19:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленно отрабатывает запрос

@rБУzzz написал:

Очень удивился, что в они так оперативно реагируют в Facebook. Может лучше писать туда, а не в техподдержку smile

Хорошая мысль, нужно взять на заметку smile
Это ведь маркетинг. Будут плохие отзывы в соц сетях - упадут продажи. Отсюда и оперативность

Неактивен

 

#24 12.02.2014 17:20:52

@rБУzzz
Участник
Зарегистрирован: 11.02.2014
Сообщений: 13

Re: Медленно отрабатывает запрос

rgbeast написал:

Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5

Ответили, что предложенное решение вас устроило

Да и Вы в Facebook написали Пользователи не смогли получить помощь от техподдержки UmiCMS. Это не совсем верно. Ребята из СЗ пытались мне помочь. Копию мой БД даже развернули у себя на сервере, что протестировать, что именно может работать не так. Поиск через поле "Поиск" действительно работает медленно и тут они ничего сделать не могут, но они объяснили, что я просто не там ищу.
Вообще упрекнуть их в нежелании помогать нельзя, тут они молодцы.

Неактивен

 

#25 12.02.2014 17:37:49

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Медленно отрабатывает запрос

Ок, исправил свой пост на Facebook. Я имел в виду, что задача не решилась обращением в техподдержку, но не знал всех деталей.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson