Сегодня я хочу поделиться с вами событием, которое сейчас происходит на моей работе. Конкретно в одном из разрабатываемых мной проектов.
Чуть более 2-х лет назад мы начали делать приложение для клиента, которое в двух словах представляет данные по средствам в одной таблице. И этим приложением пользуются около 20 человек. И мы импортируем в него данные каждые несколько минут из других систем. И этих данных немного, потому что речь идет о тысяче фондов, для которых несколько таблиц содержат от одной до нескольких строк. Кроме того, эти данные импортируются только в рабочее время. Ничего особенного.
Перед началом чтения статьи, подпишись на канал, поставь лайк, напиши интересный комментарий. Это поможет развитию этого канала.
Однако в понедельник я получил сообщение о том, что в производстве начинают появляться ошибки.
Итак, я просмотрел журналы (помните! Регистрация информации о системе занимает 1 рабочий день, чтобы сэкономить недели поиска!). И в этих журналах я обнаружил, что проблема в получении результатов поиска. Остальные запросы работают нормально. Так что это не проблема с отказом приложения. Но эти журналы также содержат информацию о том, что ошибка - это тайм-аут соединения с базой данных.
И тут я быстро собрал факты. Потому что, во-первых, это был исключительный запрос, который действительно мог вернуть все средства, а во-вторых, я вспомнил, что мы не удаляли старые данные при импорте.
Так что я быстро нашел запрос. Потому что я думал, что даже если там будет несколько миллионов записей, мы выберем только последний набор.
Но первая проблема заключалась в том, что в запросе была одна небольшая ошибка - сначала мы отфильтровали вводимый пользователем контент. Только второй фильтр должен был выбрать только записи из последнего обновления. Это уже привело к применению условия z LIKEко всей таблице.
Вторая проблема заключалась в том, чтобы не удалять старые данные.Но сколько из этого можно накопить всего за год эксплуатации? (не два года, потому что мы приступили к производству через несколько месяцев после старта).Что ж, данные в самой большой таблице собраны 75 миллионов записей. Для этого десятки миллионов записей во вспомогательных таблицах.И как я узнал от администраторов базы данных - наша база данных имеет только 2 ГБ оперативной памяти. И с этой «огромной» памятью ей приходилось делать это LIKEс десятками миллионов записей, по-прежнему состоящих из нескольких таблиц JOIN.
Все дело в том, что администраторы запустили скрипт, удаляющий данные старше месяца (вероятно, это заняло час или больше), и я получил новое предложение, которое заключается в проверке правильности запросов и добавлении механизма очистки данных, который нам больше не нужен.
Это правда, что я не проектировал приложение вначале, но мне стыдно, что за это время я не представил идею и необходимость добавить уход за базой. Кроме того, урок состоит в том, что база данных - это не просто пакет данных, в который мы можем поместить что угодно, потому что она вмещает все.