

- Главная
- Каталог
- Интернет технологии
- Базы данных (Data Base)
Базы данных (Data Base)
На данном канале мы публикуем полезный материал по Базам Данных (Data Base).
Для кого полезен канал? Для программистов, администраторов баз данных.
На канал мы выкладываем видео, ссылки на обучающие статьи на русском и английском языке, шпаргалки, различные полезные скрипты и запросы к DB.
Статистика канала
Полная статистикаchevron_rightUPDATE большого количества строк. Причём CPU почти не загружен, а запрос как будто "висит".
📌 Проблема часто кроется в отсутствии индекса на колонку фильтра в WHERE. Пример:
UPDATE orders SET status = 'archived' WHERE created_at < '2022-01-01';
{}
Если на created_at нет индекса, то PostgreSQL делает sequential scan всей таблицы. А теперь внимание: если в таблице много "мертвых" строк, которых ещё не убрал autovacuum, то PostgreSQL должен:
1. Прочитать кучу ненужных версий строк (MVCC).
2. Проверять видимость каждой строки.
3. Иногда ещё и ждать завершения других транзакций, держащих старые снапшоты.
🛠 Что делать:
- Проверить наличие индекса на колонку фильтра:
CREATE INDEX idx_orders_created_at ON orders(created_at);
{}
- Проверить состояние autovacuum:
SELECT relname, n_dead_tup, last_vacuum, last_autovacuum
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC;
{}
- Можно вручную запустить:
VACUUM ANALYZE orders;
{}
🔥 Лайфхак: если UPDATE всё равно медленный, попробуй его разбить на батчи по 10 000 строк. Это снизит нагрузку и ускорит выполнение.
EXPLAIN ANALYZE, если используется Seq Scan вместо Index Scan, значит, индексы либо отсутствуют, либо неэффективны.
- Добавьте индексы на часто фильтруемые и соединяемые поля.
2️⃣ Проблемные JOIN'ы
- Проверьте, какие типы JOIN используются. NESTED LOOP JOIN может быть проблемой на больших таблицах.
- Используйте HASH JOIN или MERGE JOIN, если это возможно.
3️⃣ Громоздкие операции (GROUP BY, ORDER BY, DISTINCT)
- Сортировка и группировка требуют много ресурсов.
- Можно ли заменить DISTINCT на EXISTS?
- Используйте индексированные столбцы в ORDER BY.
SELECT *
FROM A
INNER JOIN B ON A.key = B.key;
🔹 FULL JOIN – объединяет все данные из обеих таблиц, заполняя пропущенные значения NULL.
SELECT *
FROM A
FULL JOIN B ON A.key = B.key;
🔹 FULL JOIN с фильтрацией NULL – выбирает только строки, которые есть только в одной из таблиц.
SELECT *
FROM A
FULL JOIN B ON A.key = B.key
WHERE A.key IS NULL OR B.key IS NULL;
🔹 LEFT JOIN – возвращает все строки из A и совпадающие строки из B.
SELECT *
FROM A
LEFT JOIN B ON A.key = B.key;
🔹 LEFT JOIN (только уникальные в A) – возвращает только строки из A, которых нет в B.
SELECT *
FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL;
🔹 RIGHT JOIN – аналогично LEFT JOIN, но с приоритетом B.
SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key;
🔹 RIGHT JOIN (только уникальные в B) – выбирает строки, которые есть в B, но отсутствуют в A.
SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key
WHERE B.key IS NULL;
Сохраняйте в закладки и пользуйтесь! ⚡
created_at, а мы выполняем запрос:
SELECT * FROM orders WHERE YEAR(created_at) = 2024;
{}
Проблема в том, что функция YEAR(created_at) делает так, что индекс не используется эффективно. База данных должна пройтись по всем строкам, применяя функцию ко всем значениям. Лучше переписать так:
SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
{}
Теперь индекс сможет работать оптимально. 🔥
🏗 2. Слишком широкий индекс (Over-indexing)
Если у нас слишком много индексов на таблице, это приведёт к замедлению операций INSERT, UPDATE, DELETE. Почему? Потому что каждый раз при изменении данных БД должна обновлять все индексы. Поэтому добавляйте индексы осознанно!
📦 3. Низкая селективность индекса
Допустим, у нас есть индекс по status, но всего три возможных значения ('new', 'processing', 'done'). Если в таблице миллионы строк, но мало уникальных значений, индекс бесполезен — оптимизатор может решить, что проще выполнить полный скан таблицы.
⚠️ 4. Ошибка с покрывающим индексом
Иногда индекс покрывает все нужные колонки (INDEX(col1, col2, col3)), но запрос выбирает ещё одну (col4). Тогда база вынуждена обращаться к самой таблице, что убивает эффективность индекса.
📌 Вывод: индекс — мощный инструмент, но его неправильное использование может навредить. Перед добавлением индексов всегда анализируйте планы выполнения запросов (EXPLAIN в MySQL, EXPLAIN ANALYZE в PostgreSQL).
orders:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
total DECIMAL(10,2) NOT NULL
);
{}
Допустим, мы добавляем индексы:
CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);
{}
На первый взгляд, всё логично, но есть проблема: индекс idx_customer_order_date покрывает оба предыдущих индекса!
💡Как исправить?
Можно удалить idx_customer и idx_order_date, так как составной индекс (idx_customer_order_date) способен выполнять их работу.
📌 Как проверить ненужные индексы?
1️⃣ В PostgreSQL:
SELECT indexrelid::regclass, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC;
{}
2️⃣ В MySQL:
SHOW INDEX FROM orders;
{}
Здесь ищем индексы, которые дублируют друг друга.
Вывод: Чем меньше избыточных индексов — тем быстрее работает ваша база данных. Проверьте свои индексы прямо сейчас!
Отзывы канала
всего 4 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Базы данных (Data Base) — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 8.2K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 6.4, количество отзывов – 4, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 4545.45 ₽, а за 49 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий