YardalGedal
@YardalGedal
yeah boy

Как бороться с дедлоками?

И так, есть небольшой сервис с одной базой данных, 32 таблицами в ней и примерно 1.2 млн. записей, ~30 запросов в секунду к MariaDB (так говорит PHPMyAdmin, на деле, по идее, должно быть куда меньше) и в последнее время начал замечать что если не делать ночных перезагрузок сервера - днём, а чаще в обед или после него обязательно всё лочится дедлоком и сервис падает, при чём даже завершение всех процессов приложения не помогает, а только перезапуск MariaDB или сразу сервера.

В качестве ОС используется Ubuntu 16.04.

Опишу немного структуру БД, может быть это поможет. При проектировании базы данных я руководствовался простыми правилами:

1) Таблицы к которым идут ТОЛЬКО SELECT (и очень редкие UPDATE/DELETE/INSERT, раз в неделю, а то и месяц) запросы используют MyISAM.
1.0) Сюда я включил: все таблицы со статичными данными, которые не изменяются + одна таблица с редкими INSERT (несколько раз в час) и частыми SELECT.
2) Таблицы к которым идут SELECT + UPDATE + INSERT используют InnoDB (в MariaDB это XtraDB).
2.0) Сюда я включил: таблицу пользователей - очень частые SELECT + UPDATE, и реже INSERT; таблицу чатов - очень частые SELECT, реже UPDATE и INSERT; и другие, с которыми проблемы менее вероятны так как они менее нагружены.
2.1) Высоконагруженная таблица логов (в которой более миллиона записей) и которая использует частые запросы SELECT + INSERT использует также InnoDB (тут сомневаюсь в правильности выбора подсистемы).

Собственно суть вопроса:
Правильно ли я поступил при выборе подсистем для таблиц? Какими способами можно вылечить дедлоки?
  • Вопрос задан
  • 1889 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
1. MySQL умеет убивать deadlock, это не приводит к падению сервера.
Укажите все deadlock-запросы. Их надо отрефакторить.

2. Зачем постоянно update юзеров? Для счетчиков или даты последнего посещения лучше выбрать другое хранилище.

3. Зачем постоянно select юзеров? Используйте кэширование

4. Зачем постоянно select логов? Обычно логи только пишут. Да и БД для этого тоже вовсе не обязательно использовать.

5. Зачем постоянно select чатов? Достаточно только для новых участников чата
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы