Как в 14 раз снизить нагрузку на базу данных MySQL
Tickets
Если кратко, то таблица modx_tickets_views — критически увеличивает нагрузку на базу данных MySQL. Уменьшить нагрузку можно отключив (если включен) счетчик просмотра неавторизованными пользователями tickets.count_guests или обнулить (очистить)/удалить таблицу modx_tickets_views из базы данных MySQL.

Ниже отрывки из переписки с ТП Бегет (может кому пригодится)
Включение Redis, в данном случае означает, что у Вас появляется доступ к контейнеру с данной БД. Использовать его Вы можете как угодно.
Для реализации описанного Вами функционала потребует либо дополнительных настроек или установки плагина, либо вмешательство в код CMS.
Если кратко, то таблица modx_tickets_views — критически увеличивает нагрузку на базу данных MySQL. Уменьшить нагрузку можно отключив (если включен) счетчик просмотра неавторизованными пользователями tickets.count_guests или обнулить (очистить)/удалить таблицу modx_tickets_views из базы данных MySQL.
Ниже отрывки из переписки с ТП Бегет (может кому пригодится)
Прошу снять ограничения с сайтаНа вашем сайте sql запрос
SELECT COUNT(DISTINCT `TicketView`.`parent`, `TicketView`.`uid`, `TicketView`.`guest_key`) FROM `modx_tickets_views` AS `TicketView` WHERE `TicketView`.`parent` = 59;Мне кажеться стоит оптимизировать, потому что конструкция COUNT(DISTINCT ...) явно грамоздкая так как в таблице modx_tickets_views 2378294 записей, вот EXPLAIN этого запросаmodx3@bane.beget.ru[modx3]> EXPLAIN SELECT COUNT(DISTINCT `TicketView`.`parent`, `TicketView`.`uid`, `TicketView`.`guest_key`) FROM `modx_tickets_views` AS `TicketView` WHERE `TicketView`.`parent`
= 59;
+----+-------------+------------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------------------------------+
| 1 | SIMPLE | TicketView | NULL | range | PRIMARY | PRIMARY | 104 | NULL | 176437 | 100.00 | Using where; Using index for group-by (scanning) |
+----+-------------+------------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------------------------------+Также в качестве оптимизации могу предложить сконвертировать всю базу данных в InnoDB, что тоже скажеться хорошо на производительности.Если есть возможность, прошу помочь с перечисленной ниже оптимизацией:Здравствуйте, базу сайта перевел в innodb, создав отдельную базу — ххх, старую не стал трогать modx3, она также доступна в разделе MySQL. К сожалению запрос
Уменьшить конструкцию COUNT(DISTINCT …)
Сконвертировать всю базу данных в InnoDB
COUNT(DISTINCT ...) не смогу переписать так как здесь выборка идет по нескольким колонкам, вот небольшой совет как переписать подобный запрос stackoverflow.com/questions/24671158 /alternative-for-count-distinct, но как уже сказал проблема в том что невозможно сортировать сразу по нескольким колонкам. Также не хочеться его переписывать или вообще вносить какие либо изменения в логигу работы modx так как мы с Вами не владельцы этого кода и не сможем быстро разобраться в случае если все сломается, а сломаться может легко. Вообще могу предложить либо зачистить все таблицу modx_tickets_views либо удалить большую часть записей тем самым запрос будет выполнять быстрее, в данный момент в этой таблицы почти 3 миллиона записей, что в принципе является бутылочным горлошком с точки зрения производительности. Узнайте для чего нужна эта таблица и если она нужна для логов или это какой-нибудь счетчик посещений и скорее всего ничего особо не дает нам, то можно смело делать TRUNCATE, предварительно сделав бэкап этой таблицы.[modx3]> select count(*) from modx_tickets_views;
+----------+
| count(*) |
+----------+
| 2385727 |
+----------+
1 row in set (0,51 sec)И последний момент: Redis, за счет его высокой скорости работы, удобно использовать для хранения различных счетчиков, например, количества просмотров страниц сайта, или же каких-либо временных данных.Нет, изменения в работе сайтов автоматически не произойдут.
Означает ли это, что при включенном Redis данные таблицы modx_tickets_views начнут автоматически сохраняться в памяти Redis, а не в БД
Включение Redis, в данном случае означает, что у Вас появляется доступ к контейнеру с данной БД. Использовать его Вы можете как угодно.
Для реализации описанного Вами функционала потребует либо дополнительных настроек или установки плагина, либо вмешательство в код CMS.
Комментарии: 28
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Наверное, не просто так эта настройка выключена по умолчанию.
При этом, наш сайт находится на самом слабом сервере хостинга — h1, и проблем никаких нет.
У меня на одном из сайтов таблица tickets_views имеет 12,166,216 строк и весит1.9 ГиБ!
И функционал очень нужный (нельзя отключить подсчёт гостей) и база разбухает всё больше…
Моё видение решения (ещё не пробовал):
И за какой период ты считаешь просмотры? 10, 20, 30 минут?
Набрал по 10-150 просмотров и отключил подсчет неавторизов. Теперь это количество просматривающих страницу. (Инфо-сайт со средним качеством контента)
Как вариант — по крону пробегаться по tickets_views, считая count на данный момент и, перенеся полученный результат в отдельное поле, очищать таблицу. При последующих срабатываниях — приплюсовывать результат.
Да и как говорил Сергей, при таком подходе будут считаться просмотры, а не только посетители, мешанина будет.
— если вам критично сохранить исходную логику подсчета просмотров (которая, как уже ответил выше Сергей, скорее визиты), то можно записывать результат в отдельное поле по крону и выводить его значение, или же кэшировать сниппет. Но это не спасет от разбухания базы
— если критично уменьшить размер БД, то можно попробовать создавать для каждого тикета лишь по 1 записи, в которой будут перечислены id всех пользователей, которые просмотрели тикет. Но в таком случае отпадут гостевые просмотры.
— если нет возможности менять связанные дополнения, то остается или отключить просмотры для гостей, или повышать характеристики сервера
Я бы лучше кроном (либо плагином) время от времени просто очищал таблицу просмотров, ну или просто не обращал бы на неё внимания, не думаю что это так критично без просмотра гостями.
Это необходимо для вывода количества непрочитанных комментов в списке тикетов авторизованному пользователю.
Сайту уже несколько лет.
В последнее время, стал часто выдавать 504 Gateway Time-out
В Slow.log постоянно упоминается modsnippet/37 — TicketLatest.
Плюс размер таблицы _tickets_views базы данных — более 1,2 Гб
В системных настройках включено «Считать просмотры страниц гостями» tickets.count_guests.
Как можно повлиять на ситуацию?
Удалить таблицу _tickets_views?
И нужно ли отключать tickets.count_guests?
Если «да», то как это сделать?
2) Настройки системы -> Tickets -> tickets.count_guests -> нет
А на счет таблицы, думаю, легко можно удалить через phpMyFdmin.
Но, к каким последствиям это может привести?
Не обнуляться ли показатели просмотра страниц?
На что еще может повлиять удаление этой таблицы?