MVCC (Multi-Version Concurrency Control) trong PostgreSQL

MVCC là một kỹ thuật kiểm soát đồng thời tiên tiến được sử dụng trong PostgreSQL để cải thiện hiệu suất và khả năng mở rộng trong môi trường đa người dùng. Khác với các hệ thống cơ sở dữ liệu truyền thống sử dụng khóa (lock) để quản lý đồng thời, MVCC cho phép các giao dịch đọc và ghi đồng thời mà không chặn lẫn nhau.

Cách hoạt động của MVCC:

  1. Phiên bản dữ liệu: Mỗi khi một bản ghi (row) được cập nhật hoặc xóa, PostgreSQL không ghi đè trực tiếp lên dữ liệu cũ. Thay vào đó, nó tạo ra một phiên bản mới của bản ghi đó. Các phiên bản cũ vẫn được giữ lại trong một khoảng thời gian nhất định.
  2. Snapshot của giao dịch: Mỗi giao dịch khi bắt đầu sẽ nhận được một snapshot của cơ sở dữ liệu tại thời điểm đó. Snapshot này chứa các phiên bản dữ liệu mà giao dịch có thể nhìn thấy. Trong suốt quá trình giao dịch, nó chỉ làm việc với các phiên bản dữ liệu trong snapshot của mình, bất kể các thay đổi từ các giao dịch khác.
  3. XID (Transaction ID): Mỗi giao dịch được gán một XID duy nhất. XID này được sử dụng để theo dõi các phiên bản dữ liệu và xác định phiên bản nào có thể nhìn thấy đối với mỗi giao dịch.
  4. xmin và xmax: Mỗi bản ghi trong PostgreSQL có hai trường đặc biệt: xmin và xmax. xmin lưu trữ XID của giao dịch đã tạo ra bản ghi đó, còn xmax lưu trữ XID của giao dịch đã xóa hoặc cập nhật bản ghi (nếu có).

Ưu điểm của MVCC:

Sau đó theo lịch nó sẽ thực hiện tiến trình vacuum để dọn dẹp bản ghi cũ:

VACUUM trong PostgreSQL

VACUUM là một lệnh quan trọng trong PostgreSQL giúp dọn dẹp và tối ưu hóa cơ sở dữ liệu của bạn. Nó thực hiện hai nhiệm vụ chính:

  1. Thu hồi không gian lưu trữ:
  2. Cập nhật thống kê:

Các loại VACUUM:

Khi nào nên sử dụng VACUUM: