Оптимизация производительности баз
2 subscribers
1 photo
13 links
Download Telegram
Индексы: как не убить запись ради ускорения одного отчёта

Коллеги, давайте разберем план выполнения. Индекс — это не «ускоритель всего», а компромисс между чтением и записью. Ошибка №1: ставить B-Tree на каждый столбец подряд. Ошибка №2: держать дублирующие и пересекающиеся индексы — они съедают место, замедляют INSERT/UPDATE и путают оптимизатор.

Схема простая, но дьявол кроется в статистике. Сначала ищем запросы с реальным больным местом: дорогие сканы, сортировки, nested loop на больших объёмах, частые фильтры и JOIN по ключам. Затем смотрим селективность: если колонка почти всегда одинаковая, индекс на ней часто бесполезен. Если запрос выбирает 30–40% таблицы, оптимизатор нередко честно выберет full scan — и это нормально.

Дальше — стратегия. • Составной индекс строим под шаблон WHERE + JOIN + ORDER BY, а не «на всякий случай». • Порядок колонок важен: сначала самые селективные и используемые в фильтре. • Для покрывающих запросов добавляем только нужные поля, без фанатизма. • Не забываем про maintenance: чем больше индексов, тем дороже массовые загрузки и перестроения 🛠️

Перед созданием индекса проверьте: он реально попадёт в запрос, не дублирует ли уже существующий, не ломает ли планы на соседних запросах. Золотое правило: сначала мониторинг, потом индексы. Иначе получаете красивую схему и медленный продакшен.
Как быстро найти bottleneck: сначала мониторинг, потом индексы

Коллеги, давайте разберем план выполнения. Узкое место почти всегда видно раньше, чем его начинают «лечить» индексом: растет latency, очередь запросов, CPU, disk wait или lock wait. Ищем не «медленную базу», а конкретную точку, где система теряет время.

Схема простая, но дьявол кроется в статистике. Смотрите по слоям:
— приложение: всплеск времени ответа, ретраи, таймауты;
— БД: рост активных сессий, long-running queries, блокировки;
— хранилище: IOPS, throughput, await, cache miss;
— память: вытеснение буферов, spill на диск, рост temp usage.

Потом связываем симптомы с конкретным запросом. Если CPU высокий — ищем тяжелые сканы, сортировки, hash join; если I/O — проверяем большие чтения, плохую селективность, отсутствие covering-индексов; если lock wait — смотрим, кто держит транзакцию и почему она живет слишком долго. В продакшене так лучше не делать, и вот почему: чинить надо причину, а не следствие.

Золотое правило: сначала мониторинг, потом индексы. Без базовой картины вы легко оптимизируете не тот запрос и получите красивый план, который все равно упирается в диск или блокировки.
EXPLAIN ANALYZE: как читать план и не попасть в ловушку красивых цифр

Коллеги, давайте разберем план выполнения. EXPLAIN ANALYZE полезен только вместе с фактическим исполнением: план без runtime — это гипотеза, а не диагноз.

Смотрите в первую очередь на:
— расхождение estimated rows и actual rows;
— тип скана: Seq Scan, Index Scan, Bitmap Scan;
— узкие места по времени: Sort, Hash, Nested Loop, Materialize;
— loops: если оператор крутится тысячи раз, проблема часто не там, где кажется.

Важный момент: низкое время одного узла еще не значит, что он безобиден. Посмотрим, что тут с I/O в реальности: буферный кэш, чтение с диска и большие сортировки могут скрываться за «быстрым» планом, пока запрос не упрется в память или конкурентный доступ. А если видите сильный разъезд оценок, сначала проверьте статистику и селективность условий, а не спешите ставить новый индекс.

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

Золотое правило: сначала мониторинг, потом индексы. EXPLAIN ANALYZE отвечает не на вопрос «как ускорить вообще», а на вопрос «где именно запрос тратит время и почему».
Настройка параметров БД: где экономят, а где потом тушат инцидент

Коллеги, давайте разберем план выполнения. Конфигурация БД — не список «побольше CPU, поменьше latency», а набор компромиссов между памятью, I/O и конкуренцией за ресурсы.

— Начинайте с метрик, а не с тюнинга: CPU, wait events, буферы, лог-запись, размер рабочих наборов.
— Меняйте один параметр за раз и фиксируйте эффект; иначе потом никто не докажет, что именно помогло.
— Любой рост cache/buffer без проверки давления на память = риск свопа и деградации всего сервера.
— Параметры параллелизма и worker’ов легко превращают быстрые запросы в очередь из 100 “полезных” задач.

Схема простая, но дьявол кроется в статистике: если планы строятся на мусорных данных, то и конфиг вы “оптимизируете” под фантомную нагрузку. Сначала проверьте актуальность статистики, распределение данных, частые шаблоны запросов и узкие места по блокировкам. Потом уже трогайте work_mem, innodb_buffer_pool_size, shared_buffers, checkpoint-логику или аналоги — в зависимости от движка.

Золотое правило: сначала мониторинг, потом индексы. С конфигом то же самое: сначала измеряем, затем меняем, затем снова измеряем. В продакшене так лучше не делать наугад — один неверный параметр может улучшить бенчмарк и убить реальную нагрузку.
Секционирование таблиц не лечит медленные запросы, если фильтр не попадает в ключ

Коллеги, давайте разберем план выполнения. Partitioning — это не «ускоритель всего», а способ уменьшить объем данных, с которыми реально работает запрос. Если условия WHERE не используют ключ секции, оптимизатор спокойно пойдет по всем партициям, и вы получите сложность без выигрыша.

Смотрите на три вещи:
— как выбирается секция: по дате, диапазону, списку значений;
— есть ли pruning: отсекаются ли лишние партиции на этапе планирования;
— не ломает ли секционирование джойны, уникальность и обслуживание.

Частая ошибка — секционировать по одному полю, а фильтровать по другому. Тогда таблица красиво нарезана, но запросы все равно читают лишнее. Еще один классика: слишком мелкие партиции. Метаданные растут, план усложняется, обслуживание превращается в ручной труд с лишним I/O и блокировками.

Золотое правило: сначала мониторинг, потом индексы. Перед внедрением посмотрите реальные планы, объемы чтения и типовые запросы. Если нужен архив, горячие данные отдельно, а старые секции можно быстро чистить или переносить. Если нужен только ускоритель SELECT, иногда обычный индекс честнее и дешевле.
Forwarded from AFF.TOP
This media is not supported in your browser
VIEW IN TELEGRAM
Российские букмекеры увеличили закуп трафика с мобильных приложений

Российские букмекеры в 1 квартале 2026 года заметно нарастили закупку трафика из мобильных приложений. На фоне ужесточения регулирования они смещают бюджеты в новые каналы, где ещё есть живой трафик.

По данным UMG, доля in-app-рекламы выросла с 3-4% до 5-6% при объёме рынка около 10 млрд рублей. Но это может быть только начало — в блоге разбираем…

➡️ Читайте на сайте: https://aff.top/blog/rossiiskie-bukmekery-uvelichili-zakup-trafika-s-mobilnykh-prilozhenii

🧠 Ещё больше инсайтов → в канале AFF.top
Forwarded from AFF.TOP
This media is not supported in your browser
VIEW IN TELEGRAM
Mia Khalifa стала амбпссадором 1win

Mia Khalifa снова засветилась рядом с 1win: в Instagram она показала цепочку с логотипом бренда и статус «VIP 1win».

Параллельно всплыла история с ее ставкой на Испанию на ЧМ — по данным поста, выигрыш мог составить 200к$.

Официального подтверждения амбассадорства пока нет, но для арбитражников это уже повод для новых креативов. Что именно здесь…

➡️ Читайте на сайте: https://aff.top/blog/mia-khalifa-stala-ambpssadorom-1win

🧠 Ещё больше инсайтов → в канале AFF.top
Сложный SQL не лечится магией: сначала план, потом индексы и переписывание

Коллеги, давайте разберем план выполнения. У тяжёлого запроса обычно три причины: лишние строки в ранней стадии, плохой порядок соединений и функции/выражения, которые убивают использование индекса. Начинать надо не с «добавим ещё один индекс», а с проверки факта: сколько строк читает каждый шаг, где идёт сортировка, и не тащит ли запрос весь набор туда, где нужен один ряд.

Что обычно помогает:
— протолкнуть фильтры как можно раньше;
— убрать `SELECT *`, если половина колонок не нужна;
— заменить коррелированные подзапросы на `JOIN` или `EXISTS`, если это уменьшает повторные проходы;
— не оборачивать индексируемый столбец в функции в предикате;
— проверить, не делает ли CTE/VIEW лишнюю материализацию. Посмотрим, что тут с I/O в реальности.

Отдельно следите за `OR`, `NOT IN`, `DISTINCT` и `ORDER BY` без нужного покрытия. Эти конструкции часто выглядят безобидно, а потом внезапно дают full scan и большой temp. Если запрос начал «тормозить после добавления одного условия», ищите не только селективность, но и то, как оптимизатор пересобрал план.

Золотое правило: сначала мониторинг, потом индексы. Если план уже понятен, переписывайте минимально и проверяйте эффект на объёме, близком к продакшену. В продакшене так лучше не делать, и вот почему: красивый SQL без плана — это просто дорогой текст.
Миграция данных без простоя: где чаще всего рвётся план и как это остановить

Коллеги, давайте разберем план выполнения. Миграция ломается не на «копировании данных», а на хвостах: долгие транзакции, неконсистентные дампы, скрытые зависимости, фоновые джобы. Если это не учесть, приложение либо встаёт, либо начинает читать половину старой схемы и половину новой.

Базовый безопасный сценарий такой:
— сначала инвентаризация: таблицы, FK, триггеры, очереди, внешние интеграции;
— потом прогон на копии с замером времени чтения, записи и восстановления;
— затем двойная запись или репликация, чтобы не держать прод на одном окне;
— и только после этого переключение с быстрым rollback-планом.

Перед переключением проверьте не объём, а поведение: есть ли длинные транзакции, блокировки на запись, перестроение индексов, бэкграунд-воркеры, которые лезут в старую схему. Посмотрим, что тут с I/O в реальности: часто именно оно превращает «быстрый cutover» в многочасовой простой.

Схема простая, но дьявол кроется в статистике: если после переноса план запроса уехал, вы получите не миграцию, а тихую деградацию. Золотое правило: сначала мониторинг, потом индексы. Сначала убедитесь, что старый и новый контуры читают и пишут одинаково, и только потом выключайте старый путь.
Forwarded from КРАВЧЕНКО
Дорогие коллеги и партнеры,

Наш маршрут конференций за последние недели, получился особенно насыщенным.

Со стендами PoshFriends мы побывали на MAC и GGate, а затем продолжили встречи уже в полях iGB Live в Лондоне.

В Ереване увиделись с любимыми SEO-командами, попробовали местные вина, обменялись новостями и зарядились энергией УБТ-команд.

В Тбилиси обсуждали тренды, новые связки и совместные планы, встречались с действующими партнерами и знакомились с новыми. А за настроение на стенде отвечала Черемша, которая чуть не стала маскотом одного из наших продуктов. С этой задачей, кажется, справилась лучше всех.

В Лондоне все было уже по-деловому. Провели серию встреч с топ-партнерами, обсудили Японию, бурж и новые точки роста. География интересов растет, планы становятся амбициознее. Воротники, как выяснилось, нагладили не зря.

Спасибо всем, с кем удалось увидеться на этом маршруте. За открытые разговоры, новые идеи, доверие и планы, которые постепенно превращаются в реальные проекты.

Конференционный сезон продолжается. Скоро увидимся снова.

Всегда ваши, Команда Posh Friends 🤝
Forwarded from AFF.TOP
This media is not supported in your browser
VIEW IN TELEGRAM
Короткий домен Telegram перестал работать

Telegram лишился домена t.me: он разделегирован и больше не работает на уровне регистратора. Платформа срочно переезжает на telegram.me, а владельцам крупных каналов стоит обновить публичные ссылки. Сроки восстановления неизвестны, и есть риск, что t.me не вернётся вовсе на фоне давления на Telegram.

➡️ Читайте на сайте: https://aff.top/blog/korotkii-domen-telegram-perestal-rabotat

🧠 Ещё больше инсайтов → в канале AFF.top
Forwarded from AFF.TOP
This media is not supported in your browser
VIEW IN TELEGRAM
Youtube тестирует поиск с AI

YouTube начал тестировать Ask YouTube — поиск с ИИ, где можно задавать вопросы обычным языком и получать не список ссылок, а готовую подборку видео и фрагментов.

Фича уже доступна в США и работает на сложные запросы: если нужно, ИИ уточняет вопрос и подсказывает следующий шаг.

Что это значит для поиска на YouTube и когда новинка дойдёт до других…

➡️ Читайте на сайте: https://aff.top/blog/youtube-testiruet-poisk-s-ai

🧠 Ещё больше инсайтов → в канале AFF.top
EXPLAIN ANALYZE: как читать план и не попасть в ловушку красивых цифр

Коллеги, давайте разберем план выполнения. EXPLAIN ANALYZE полезен только вместе с фактическим исполнением: план без runtime — это гипотеза, а не диагноз.

Смотрите в первую очередь на:
— расхождение estimated rows и actual rows;
— тип скана: Seq Scan, Index Scan, Bitmap Scan;
— узкие места по времени: Sort, Hash, Nested Loop, Materialize;
— loops: если оператор крутится тысячи раз, проблема часто не там, где кажется.

Важный момент: низкое время одного узла еще не значит, что он безобиден. Посмотрим, что тут с I/O в реальности: буферный кэш, чтение с диска и большие сортировки могут скрываться за «быстрым» планом, пока запрос не упрется в память или конкурентный доступ. А если видите сильный разъезд оценок, сначала проверьте статистику и селективность условий, а не спешите ставить новый индекс.

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

Золотое правило: сначала мониторинг, потом индексы. EXPLAIN ANALYZE отвечает не на вопрос «как ускорить вообще», а на вопрос «где именно запрос тратит время и почему».
Миграция данных без простоя: планируйте откат раньше, чем начнёте копировать

Коллеги, давайте разберем план выполнения. Миграция ломается не на COPY, а на недооценке блокировок, триггеров и времени на сверку.

Схема простая:
— заранее отделите перенос схемы от переноса данных;
— проверьте FK, триггеры, unique-ограничения и фоновые джобы;
— измерьте, сколько занимает полный прогон на копии, а не «на глаз»;
— держите обратимый шаг: старый источник не удалять, пока не пройдена сверка.

Посмотрим, что тут с I/O в реальности. Если таблица большая, не лейте всё под одной транзакцией: получите долгие блокировки, рост WAL/redo и сюрпризы для репликации. Лучше батчи, контроль пауз, отдельное окно на финальный дельта-дамп и переключение. Золотое правило: сначала мониторинг, потом индексы.

После переноса обязательно проверьте не только counts, но и контрольные суммы, выборочные бизнес-ключи и самые «грязные» места: NULL-ы, дубликаты, невалидные даты, строки с разной кодировкой. Именно там чаще всего прячется тихая порча данных, которую потом ищут неделями.

В продакшене так лучше не делать, и вот почему: миграция без плана отката — это не проект, а ставка на удачу. Сначала репетиция на копии, потом дельта, потом переключение, и только после этого отключаем старый контур.