1. Đâu là giới hạn của database hiện tại - Xác định vấn đề:
  2. Tư duy để giải quyết điểm nghẽn:
    1. Điểm nghẽn lấy data:

      • Block/page

        • Mỗi block sẽ có 8K
        • Mỗi block trên disk sẽ lưu các data rows
        • Mỗi table dữ liệu nó sẽ có nhiều block để lưu toàn bộ data rows của table
        • Cách giải quyết:
          • Giảm lượng quét qua và lấy block của bảng đó trên disk nhỏ nhất có thể

            Có thể dùng index, partition

            tư duy của Partition là chia table ra cách phân vùng block khác nhau để lưu các data theo cách điều kiện cụ thể

      • I/O

        • Cùng một database những dữ liệu nhiều ⇒ Chia dữ liệu của mỗi bảng ra từng phân vùng vật lý khác nhau để giảm I/O
        • Nếu database quá lớn thì ⇒ áp dụng kĩ thuật Sharding chia database ra cách database con, nhưng lưu ý một điều là để cách dữ liệu giống nhau của cách bản trên cùng một cụm để phục vụ cho Join
        • Nếu gặp vấn đề I/O khi các câu lệnh DML/Select nằm cùng trên một database ⇒ áp dụng kĩ thuật Replication để tách DML và select ra các database khác nhau
        • Nếu có nhiều cụm database làm việc với nhau nhưng nếu một node database crashed ⇒ Áp dùng Master/Slave
    2. Điểm nghẽn kết nối:

      • Cách hoạt động của một session:

        Tạo kết nối mới tới PostgreSQL ⇒ Thiết lập kết nỗi (Xác thực) ⇒ Gửi và nhận DML/Select ⇒ Đóng kết nối

      • Nếu có quá nhiều kết nối tới Postgres Server → lãng phí tài nguyên và có thể tệ hơn là làm nghẽn và crash server (do việc khởi tạo nhiều session làm nghẽn I/O và Ram)

        ⇒ Áp dụng Connection Pool

        • pgpool-II
        • pgbouncer (có thể kết hợp với HA proxy)
    3. Điểm nghẽn MVCC:

      • Vấn đề: Relative Doc
      • Cách Giải quyết: Đánh giá và xác định lúc nào lượng truy cập đồng thời thấp ⇒ schedule cho vacuum chạy

      Note: Không được để vacuum chạy mặc định vì nếu chạy khi lượng truy cập đồng thời cao ⇒ Sẽ làm database chậm - ảnh hưởng tới người dùng

Tài Liệu này được Tham khảo anh Trần Quốc Huy: Link