an.id.vnv2.0
Back to blog list

Tối ưu hóa câu lệnh PostgreSQL: Từ cơ bản đến nâng cao

Các kỹ thuật thực chiến giúp tăng tốc độ truy vấn cơ sở dữ liệu PostgreSQL bằng cách lập chỉ mục (index) và tối ưu hóa câu lệnh EXPLAIN.

July 10, 2026
postgresqldatabasebackendperformance

Tối ưu hóa câu lệnh PostgreSQL: Từ cơ bản đến nâng cao

Khi ứng dụng của bạn đạt quy mô hàng triệu bản ghi, cơ sở dữ liệu thường trở thành điểm nghẽn lớn nhất của hệ thống. Đối với PostgreSQL, việc biết cách tối ưu hóa câu lệnh truy vấn là kỹ năng bắt buộc của một Backend Engineer.

Dưới đây là một số kỹ thuật cốt lõi giúp bạn cải thiện tốc độ cơ sở dữ liệu một cách nhanh chóng.


1. Đọc và phân tích kế hoạch thực thi với EXPLAIN ANALYZE

Trước khi tối ưu bất kỳ câu lệnh nào, bạn cần biết PostgreSQL đang thực thi nó như thế nào dưới công cụ phân tích:

EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'me@an.id.vn';

Hãy chú ý các thuật ngữ chính trong kết quả trả về:

  • Seq Scan (Sequential Scan): PostgreSQL đang quét toàn bộ bảng từ đầu đến cuối để tìm dữ liệu. Đây là dấu hiệu cảnh báo cần tạo index!
  • Index Scan: PostgreSQL đang sử dụng chỉ mục để tìm dữ liệu trực tiếp, tốc độ tối ưu nhất.

2. Sử dụng Index một cách thông minh

  • B-Tree Index: Loại mặc định và tốt nhất cho các phép so sánh =, <, >, IN.
  • Composite Index (Chỉ mục phức hợp): Khi bạn thường xuyên tìm kiếm bằng nhiều cột (ví dụ WHERE company_id = 1 AND status = 'active'), hãy lập chỉ mục chung cho cả hai cột:
    CREATE INDEX idx_users_company_status ON users(company_id, status);
    Quy tắc ngón tay cái: Cột có độ lọc cao hơn (cardinality cao) nên đặt trước trong khai báo composite index.

3. Tránh sử dụng phủ định hoặc hàm trong mệnh đề WHERE

Nếu bạn viết:

SELECT * FROM users WHERE UPPER(username) = 'ANNGUYEN';

PostgreSQL sẽ không thể sử dụng index tiêu chuẩn trên cột username vì giá trị đã bị thay đổi qua hàm UPPER(). Thay vào đó, hãy tạo Expression Index hoặc chuẩn hóa dữ liệu trước khi lưu trữ.

Hy vọng những chia sẻ này sẽ giúp database của bạn chạy nhanh như chớp!