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ặc EXPLAIN.


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 hay hash 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 trong WHERE (chia nhỏ union nếu cần)

  • Dùng EXISTS thay vì IN nếu subquery lớn

  • Gộ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