Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, требуется помощь с медленно работающим запросов.
Дано:
CMS система UmiCMS.
СУБД - mysql 5.1.x
База - объектно-ориентированная. Innodb.
Запросы конструируются самой системой и изменению не подлежат.
Система крутится на VPS. Оперативки выделено до 12Гб.
Запрос:
Неактивен
Покажите структуру таблиц, т.е. результат
show table cms3_object_types;
и так для всех 5ти таблиц из запроса
И ещё SHOW VARIABLES;
Неактивен
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 файле. А то он шибко большой, а как спрятать что-то не нашел.
Неактивен
Не менять запрос - серьезное ограничение, но чтобы понять причину попробуйте сделать так:
1) убрать DISTINCT
2) поочередно выкидывайте JOIN внешних таблиц (кроме o) и смотрите после какого выбрасывания запрос ускорится.
3) сделайте профайлинг запроса
По конфигу:
innodb_buffer_pool_size должен быть меньше объема памяти. Сделайте, например, 6Гигов
Неактивен
По Вашим рекомендациям - завтра попробую и отпишусь.
innodb_buffer_pool_size у меня меня итак меньше. Оперативной памяти на VPS 16Гб. Или должно быть ещё меньше?
Неактивен
Нет, в этом случае уменьшать не надо. Просто от первого поста было впечатление, что её всего 12.
Неактивен
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
Неактивен
Очень хорошо. Не до конца понятно почему copying to tmp table занимает основное время, но понятна связь с o_asteriks. Скорее всего из-за условия o_asteriks.text_val LIKE '...', полный текст попадает в таблицу, которая потом сортируется. Может быть, возможно избавиться от условия на полный текст в рамках текущей CMS?
Неактивен
Имхо, "copying to tmp table" включает в себя и группировку. Теоретически может помочь переход на более поздние версии, где временные таблицы создаются с hash индексом.
o_asteriks вообще в запросе не нужна. Перенеся условие на oc_230_lj за счет oc_230_lj.field_id = '230' мы получим всего 1 строку, т.е. временная таблица будет меньше почти в 10 раз. Отсюда и ускорение.
Неактивен
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 (начитался тут пытаясь разобраться)? Временные таблицы ведь создаются на физическом диске, правильно я понимаю?
Неактивен
Нет в оперативной, если не превышают max_heap_table_size и tmp_table_size и хватает памяти.
Можно проверить через show status
Неактивен
vasya написал:
Нет в оперативной, если не превышают max_heap_table_size и tmp_table_size и хватает памяти.
Можно проверить через show status
Каким это проверить? Что именно надо смотреть?
Неактивен
http://dev.mysql.com/doc/refman/5.6/en/ … ables.html
переменные
Created_tmp_disk_tables
Created_tmp_tables
Неактивен
Насколько я знаю, UmiCMS достаточно гибкая система. 6 секунд на запрос - это разве не гарантийный случай? Думаю, что техподдержка должна сделать для вас необходимые модификации (тем более вы знаете в чем дело - нужно исключить поиск по полному тексту). Сам на практике с Umi не сталкивался, но это как раз характеризует систему положительно - значит ваш случай скорее исключение.
По конфигурации - мало шансов на успех, но попробовать стоит. Приведите:
Неактивен
rgbeast написал:
Насколько я знаю, UmiCMS достаточно гибкая система. 6 секунд на запрос - это разве не гарантийный случай? Думаю, что техподдержка должна сделать для вас необходимые модификации (тем более вы знаете в чем дело - нужно исключить поиск по полному тексту). Сам на практике с Umi не сталкивался, но это как раз характеризует систему положительно - значит ваш случай скорее исключение.
По конфигурации - мало шансов на успех, но попробовать стоит. Приведите:SHOW GLOBAL VARIABLES LIKE '%table_size';
SHOW GLOBAL STATUS LIKE 'Created_tmp%';
В том то и дело, что техподдержка ответила, что помочь не могут, т.к. это уже проблема разработчиков, а они вносить такого рода изменения во второй ветке системы уже не будут, т.к. заняты допиливанием третьей ветки.
Неактивен
@rБУzzz написал:
В том то и дело, что техподдержка ответила, что помочь не могут, т.к. это уже проблема разработчиков, а они вносить такого рода изменения во второй ветке системы уже не будут, т.к. заняты допиливанием третьей ветки.
Наши люди везде найдут выход
Можно сделать заплатку после того как запрос сконструирован, но перед отправкой в базу. И регулярным выражением его: если вид такой, то меняем на другой. Это не изменит остальные запросы и не сильно помешает вам обновлять систему.
Перед обращением за гарантией, уберете заплатку
Жесть конечно, но может и помочь.
Со стороны MySQL можно лишь расчитывать на некоторое ускорение в версиях где временная таблица создается с hash индексом.
Неактивен
vasya написал:
@rБУzzz написал:
В том то и дело, что техподдержка ответила, что помочь не могут, т.к. это уже проблема разработчиков, а они вносить такого рода изменения во второй ветке системы уже не будут, т.к. заняты допиливанием третьей ветки.
Наши люди везде найдут выход
Можно сделать заплатку после того как запрос сконструирован, но перед отправкой в базу. И регулярным выражением его: если вид такой, то меняем на другой. Это не изменит остальные запросы и не сильно помешает вам обновлять систему.
Перед обращением за гарантией, уберете заплатку
Жесть конечно, но может и помочь.
Со стороны MySQL можно лишь расчитывать на некоторое ускорение в версиях где временная таблица создается с hash индексом.
Хм... Можно конечно попробовать, но что-то не уверен. Запрос выполняется из админ зоны, а это отдельная песня...
Начиная с какой версии временные таблицы идут с hash индексом?
Неактивен
MySQL 5.6 / MariaDB 5.5
Но в доке сказано про временную таблицу из from-подзапроса. По идее эта оптимизация должна быть доступна и в остальных случаях, но нужно проверять.
Неактивен
Таблицы у вас создаются в основном не на диске, значит конфигурацией не исправить.
Технически, кажется, что не обязательно менять сам класс, который обращается к базе, а можно поменять условия с которыми он вызывается в админке (обычно достаточно изменить один файл).
Неактивен
vasya написал:
MySQL 5.6 / MariaDB 5.5
Но в доке сказано про временную таблицу из from-подзапроса. По идее эта оптимизация должна быть доступна и в остальных случаях, но нужно проверять.
В общем ясно, что без изменения формируемого запроса обойтись не получится. Посмотрю можно ли обновить СУБД до более свежей версии. Спасибо Вам большое за помощь и участие.
Неактивен
Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5
Ответили, что предложенное решение вас устроило
Неактивен
rgbeast написал:
Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5
Ответили, что решение вас устроило
Да, пока я тут пытался решить проблему по сложному, они мне объяснили, что просто я не в том поле ищу по номеру заказа.
Мне мои менеджеры настолько вынесли мозг, что я не разобравшись, что именно и куда они вбивают, полез сразу в недра системы. По факту есть отдельное поле для номера заказа, поле куда они вбивали номер - предназначено для общего поиска по содержимому всех полей всех заказов. Именно поэтому там такой большой запрос и такой медленный.
Ту инфу, что удалось накопать в процессе поиска, я им продублировал, возможно это поможет как откорректировать логику конструктора запросов.
Очень удивился, что в они так оперативно реагируют в Facebook. Может лучше писать туда, а не в техподдержку
Неактивен
@rБУzzz написал:
Очень удивился, что в они так оперативно реагируют в Facebook. Может лучше писать туда, а не в техподдержку
Хорошая мысль, нужно взять на заметку
Это ведь маркетинг. Будут плохие отзывы в соц сетях - упадут продажи. Отсюда и оперативность
Неактивен
rgbeast написал:
Задал вопрос в Facebook UMI.CMS: https://www.facebook.com/UMI.CMS/posts/ … ream_ref=5
Ответили, что предложенное решение вас устроило
Да и Вы в Facebook написали Пользователи не смогли получить помощь от техподдержки UmiCMS. Это не совсем верно. Ребята из СЗ пытались мне помочь. Копию мой БД даже развернули у себя на сервере, что протестировать, что именно может работать не так. Поиск через поле "Поиск" действительно работает медленно и тут они ничего сделать не могут, но они объяснили, что я просто не там ищу.
Вообще упрекнуть их в нежелании помогать нельзя, тут они молодцы.
Неактивен
Ок, исправил свой пост на Facebook. Я имел в виду, что задача не решилась обращением в техподдержку, но не знал всех деталей.
Неактивен