Заметки с митапа "Как определить насколько плоха схема БД" Data Egret
Аудит бд.
Ошибки по триггерам в логах - пара триггеров на одну таблицу, дубли.
60 колонок, 75 foreign keys.
Пропажа данных - из-за каскадного удаления по триггерам.
1231 таблица, потенциально опасных мест - 115 на таблицу, 78 и менее.
Насколько такая схема бд адекватна вообще?
Foreign key with on_delete cascade
Покрутить конфиги легко, а работать со схемой долго и муторно.
Бд с плохой историей
Две стороны проблемы:
Слишком много foreign keys с триггерами и полное отсутствие foreign keys.
Сильно нормированные бд, ненормированные бд.
Переносить управление консистентностью на уровень приложения, не надеяться на бд и foreign keys.
Размер индекса больше размера таблицы - проблемы с запросами к конкретной таблице. Это бывает, когда с таблицей что-то не так, лишние индексы, например. Собрать статистику по чтениям с этих индексов.
top_tables.sql
low_load_indexes.sql
Статистику лучше сбрасывать время от времени, чтобы видеть актуальную картину
Собрать статистику в начале и конце недели.
Запрос надо запустить на мастере и на репликах, т.к. индексы могут юзаться на репликах
Планы запросов учитывают индексы, при удалении лишних базе станет легче.
Новый индекс перекрывает старый - старый можно удалить. Есть два индекса по одному полю, и они используются в одном запросе - сделать индекс по двум полям и дропнуть старые.
4 модели хранения в постгресе. 2 - хранения в тосте. Типы данных с переменной длиной уезжают в тоаст-таблицу. Внутренний foreign key, дополнительное время на доступ к данным. Статистика, анализатор может игнорить длинные данные, поэтому все пихать в json плохо, база эти поля игнорит.
Процессорное время для гуляния по json. Индекс строить или по всему json, тогда индекс будет огромный. Либо по конкретному пути json'а, но тогда проще вытащить это поле и построить индекс по нему.
Индексы раздуваются быстрее, в репо есть запросы на этот подсчет.
Переделать старый индекс в новый. Integer -> biginteger через новое поле, либо через новую таблицу.
Задержка репликации для тяжелых аналитических запросов, надо ставить задержку на время самого выполнения запроса.
#HighLoad2019