Какие знаешь способы оптимизации запросов в БД

Ответ

  1. Индексы – ускоряют поиск по часто используемым полям.
    CREATE INDEX idx_user_email ON users(email);
  1. Оптимизация запросов – избегайте SELECT *, используйте только нужные поля.
    SELECT id, name FROM users WHERE active = true;
  1. JOIN вместо подзапросов – JOIN обычно эффективнее вложенных запросов.

  2. Кэширование – сохраняйте результаты частых запросов (Redis, Memcached).

  3. Партиционирование – разделение больших таблиц на части по ключу (например, по дате).

  4. Оптимизация структуры БД – нормализация/денормализация в зависимости от сценариев.

  5. Batch-запросы – группировка нескольких операций в один запрос.

  6. Использование EXPLAIN – анализ плана выполнения запроса для выявления узких мест.

  7. Лимиты и пагинация – не загружайте все данные сразу.

    SELECT * FROM orders LIMIT 10 OFFSET 20;
  1. Репликация – чтение с реплик для снижения нагрузки на мастер.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши базы данных! Слушай, давай я тебе на пальцах объясню, как не угробить свою БД в ноль, а то потом будешь плакать, что всё тормозит.

Первое, что ты должен сделать, как только у тебя в таблице больше трёх записей — это индексы. Это как оглавление в книге, ёпта! Без него искать главу «про любовь» придётся, листая всю хуйню с начала. Вот так и создаёшь:

CREATE INDEX idx_user_email ON users(email);

Но не обкуривайся ими, как дурак! Каждый новый индекс — это доп. нагрузка на запись. Только на то, что реально ищешь.

Дальше, смотри сюда. Ты пишешь SELECT * FROM users? Ну ты и мудак, прости меня. Зачем тебе все эти 50 полей, если нужны только id и name? Ты ж не в магазин за «всем понемногу» пришёл! Бери только нужное:

SELECT id, name FROM users WHERE active = true;

JOIN — это наш бро. А вложенные подзапросы на каждом шагу — это пиздец, который может всё завалить. JOIN'ы обычно куда шустрее, если их правильно написать. Запомни это.

Кэширование — это святое. Зачем каждый раз дергать базу за одними и теми же данными, которые меняются раз в сутки? Засунь это в Redis или Memcached и живи спокойно. Экономия — мать ебаного порядка.

Когда таблица разрастается до размеров «ой, мама», пора её партиционировать. Разрежь эту толстую тушку на куски по дате или региону. И дышать легче, и искать быстрее.

Структура БД — это вам не хухры-мухры. Иногда надо нормализовать до посинения, а иногда — сознательно допустить дублирование (денормализовать), чтобы не делать 15 JOIN'ов на каждый чих. Головой думай, для чего твоё приложение.

Batch-запросы — это когда ты не пишешь 100 отдельных INSERT, а пакуешь их в одну здоровенную посылку. Сервер базы аж вздохнёт с облегчения.

Твой лучший друг для разбора полётов — EXPLAIN. Засунул перед своим кривым запросом, и он тебе покажет, где он планирует ебашить по индексам, а где будет тупо перебирать всю таблицу. Удивление пиздец иногда бывает!

Никогда не выгружай всё скопом. Лимиты и пагинация — это не просто мода, это вопрос выживания. Представь, что тебе вывалили 10 тонн картошки и сказали «разбери». Вот так же и база чувствует себя.

SELECT * FROM orders LIMIT 10 OFFSET 20;

И последний лайфхак — репликация. Нагрузил мастер-базу на запись? Пусть читает данные с её клонов-реплик. Разделяй и властвуй, блядь.

Вот и вся магия. Не так страшен чёрт, как его малюют, главное — не делать хуйню и думать головой.