Handle Large Query SQL
Một truy vấn SQL nặng, bạn debug và tối ưu ra sao ?
💣 Tình huống:
Một truy vấn SQL đang chạy chậm → gây timeout, treo service, hoặc response time cao → ảnh hưởng đến người dùng và hệ thống.
🧠 Cách tiếp cận debug & tối ưu như một Senior:
✅ 1. Xác định truy vấn nào đang chậm
Log SQL nếu có Hibernate, JDBC log.
Dùng công cụ APM (New Relic, Datadog) hoặc profiler để trace slow query.
Nếu dùng MySQL:
SHOW FULL PROCESSLIST
,slow_query_log
, hoặcEXPLAIN
.
✅ 2. Phân tích plan thực thi
Chạy:
EXPLAIN ANALYZE <your_query>;
hoặc đơn giản:
EXPLAIN <your_query>;
Check các điểm sau:
Full Table Scan hay Index Scan
Using temporary hoặc Using filesort
Join strategy (Nested Loop? Hash Join?)
Cost estimate (rows, filtered, time)
✅ 3. Kiểm tra Index
Cột nào dùng
WHERE
,JOIN
,ORDER BY
,GROUP BY
?Có sử dụng index phù hợp không?
Dùng
btree
hayhash
index?Index có bị invalidation do hàm (
UPPER()
,DATE()
...)?
➡️ Nếu thiếu index → tạo:
CREATE INDEX idx_user_email ON users(email);
✅ 4. Tối ưu SQL logic
Tránh
SELECT *
→ chỉ lấy trường cầnĐẩy filter xuống sớm nhất
Tránh
OR
trongWHERE
(chia nhỏ union nếu cần)Dùng
EXISTS
thay vìIN
nếu subquery lớnGộp truy vấn nhỏ lại, hoặc tách truy vấn phức tạp thành nhiều bước nếu cần
✅ 5. Check dữ liệu
Table có bao nhiêu rows? Partition chưa?
Column statistics có cập nhật chưa? (
ANALYZE TABLE
)Có sử dụng cache (Redis...) chưa?
Có đang query dữ liệu “cold” không? (ví dụ: last 5 years)
✅ 6. Hạ tầng
Connection pool có đủ? Có timeout không?
Có cần tăng memory hoặc tuning server (buffer pool, cache size...)?
Có đang truy vấn remote DB?
📌 Ví dụ thực tế:
SELECT * FROM orders WHERE user_id = 123 AND status = 'PAID' ORDER BY created_at DESC LIMIT 100;
Nếu chậm → check index: có
(user_id, status, created_at)
không?Nếu chưa có → thêm:
CREATE INDEX idx_orders_user_status_date ON orders(user_id, status, created_at DESC);
🧰 Kết luận:
Tối ưu SQL là sự kết hợp của:
Phân tích logic query
Indexing đúng
Biết DB engine hoạt động ra sao
Cân nhắc scale hệ thống (shard, cache, replicate, async...)
Muốn deep hơn có thể nói về query rewrite, denormalization, hoặc materialized view.
Last updated