Основи баз даних
VTFK • 2025
Лекція 19: MongoDB Aggregation
Фокус: продуктивність запитів
Окрема структура даних, яка зберігає відсортовані значення поля з посиланням на рядки.
Аналогія: Як алфавітний покажчик у кінці книги — швидко знайти потрібне
Структура під капотом
| Операція | Full Scan | З індексом | Прискорення |
|---|---|---|---|
| 10K рядків | 10,000 | ~14 | 714x |
| 100K рядків | 100,000 | ~17 | 5,882x |
| 1M рядків | 1,000,000 | ~20 | 50,000x |
| 10M рядків | 10,000,000 | ~24 | 416,666x |
Базові синтаксиси
-- Простий індекс
CREATE INDEX idx_email ON users(email);
-- Композитний (на кількох полях)
CREATE INDEX idx_user_created ON orders(user_id, created_at);
-- Унікальний
CREATE UNIQUE INDEX idx_email_unique ON users(email);
-- DESC індекс (для сортування)
CREATE INDEX idx_recent_orders ON orders(created_at DESC);
-- Видалення
DROP INDEX idx_email ON users;
Перегляд плану виконання
-- Без індексу
EXPLAIN ANALYZE
SELECT * FROM users WHERE email='test@example.com';
-- Seq Scan on users (cost=0.00..35.50, rows=1)
-- З індексом
CREATE INDEX idx_email ON users(email);
EXPLAIN ANALYZE
SELECT * FROM users WHERE email='test@example.com';
-- Index Scan using idx_email (cost=0.29..8.30, rows=1)
Порівняння стратегій
Оптимізація сложних запитів
-- Поширений запит
SELECT * FROM orders
WHERE user_id=123 AND created_at>'2025-01-01'
ORDER BY created_at DESC
LIMIT 10;
-- Оптимальний індекс
CREATE INDEX idx_user_created ON orders(
user_id, -- перше (більш селективне)
created_at DESC -- друге (для ORDER BY)
);
-- Тепер БД використовує один індекс
Композитний індекс (a, b, c) покриває всі три умови за один lookup
Індекси сповільнюють INSERT/UPDATE/DELETE
-- 20+ індексів на таблиці
CREATE INDEX idx1 ON products(name);
CREATE INDEX idx2 ON products(price);
CREATE INDEX idx3 ON products(category);
-- Більше індексів = більше запису
БД оновлює всі індекси при INSERT
-- 3-5 індексів на поширені запити
CREATE INDEX idx_name_price ON products(name, price);
CREATE INDEX idx_category ON products(category);
-- Меньше = швидше
Індексуй тільки критичне
Реальний сценарій
-- Товари
CREATE INDEX idx_active_category ON products(
category, price DESC
) WHERE active=true;
-- Замовлення
CREATE INDEX idx_user_recent ON orders(
user_id, created_at DESC
);
-- Пошук
CREATE INDEX idx_product_search ON products(
name COLLATE utf8_general_ci
) USING FULLTEXT;
Вимірюй перед оптимізацією!
Лекція 21: Підсумки
Дякую за увагу! 💾