Không có Index
Không có index = full table scan. Mỗi query phải đọc toàn bộ bảng:
-- 10 triệu rows → scan 10 triệu rows
SELECT * FROM users WHERE email = '[email protected]';
B-Tree Index
Index = sorted data structure giúp tìm kiếm O(log n):
CREATE INDEX idx_users_email ON users(email);
-- Giờ chỉ cần ~23 bước (log2 of 10M) thay vì 10M bước
SELECT * FROM users WHERE email = '[email protected]';
Composite Index
-- Index trên nhiều columns
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
-- Query này SẼ dùng index (left-most prefix)
SELECT * FROM orders WHERE user_id = 123;
SELECT * FROM orders WHERE user_id = 123 AND created_at > '2024-01-01';
-- Query này KHÔNG dùng index (skip user_id)
SELECT * FROM orders WHERE created_at > '2024-01-01';
EXPLAIN ANALYZE
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = '[email protected]';
-- Output:
-- Index Scan using idx_users_email on users
-- Index Cond: (email = '[email protected]')
-- Planning Time: 0.1ms
-- Execution Time: 0.05ms ← fast!
Key insight: Index không miễn phí — mỗi INSERT/UPDATE phải cập nhật index. Chỉ index columns mà bạn filter hoặc join thường xuyên.