SQL & Database/SQL nâng cao/Indexing — Tại sao query chậm và cách fix
1/3
~22 phútSQL nâng cao

Indexing — Tại sao query chậm và cách fix

Hiểu B-Tree index, composite index, EXPLAIN ANALYZE. Biết khi nào cần index và khi nào không.

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.