Cơ sở dữ liệu 22/09/2026 6 phút

GIN index trong PostgreSQL: đánh chỉ mục bên trong jsonb, mảng và văn bản

B-tree đánh chỉ mục cả giá trị; GIN đánh chỉ mục từng thành phần bên trong nó — mỗi khoá jsonb, mỗi phần tử mảng, mỗi từ trong văn bản. Đo thật ba truy vấn trên bảng 1 triệu dòng: jsonb nhanh gấp 27 lần, full-text gấp 18 lần, và cái giá phải trả.

Cơ sở dữ liệu 22/09/2026 6 phút

Trigram pg_trgm trong PostgreSQL: tìm gần đúng, chịu được lỗi gõ

pg_trgm đo độ tương tự chuỗi bằng tỉ lệ trigram chung, nên tìm được cả khi gõ sai chính tả — điều LIKE và full-text search không làm được. Đo thật: KNN với GiST 190 ms, ngưỡng với GIN 104 ms, và Postgersql gõ sai vẫn tìm ra PostgreSQL. Chọn GiST hay GIN. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

LATERAL join trong PostgreSQL: top-N mỗi nhóm gọn gàng, nhanh hơn window function

LATERAL cho subquery bên phải tham chiếu cột bảng bên trái — điều subquery thường trong FROM không làm được. Đo thật: lấy 3 đơn mới nhất mỗi khách bằng LATERAL + LIMIT + index chạy 158 ms, đọc 600 nghìn trang; window row_number phải quét cả 3 triệu dòng, 540 ms, 3 triệu trang. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 7 phút

Nạp dữ liệu lớn vào PostgreSQL: vì sao bỏ index rồi tạo lại nhanh gần gấp đôi

Mỗi index phải cập nhật theo từng dòng chèn, nên nạp khối lượng lớn vào bảng đã đầy index rất chậm. Đo thật: nạp 3 triệu dòng với 4 index sẵn mất 12,6 giây; bỏ index thứ cấp rồi tạo lại sau khi nạp chỉ 7 giây và bảng còn nhỏ hơn. Và một điểm bất ngờ về maintenance_work_mem. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

wal_compression và full_page_writes: giảm WAL an toàn, và cái bẫy tắt full_page_writes

full_page_writes tạo ra full-page image trong WAL (chống torn page); wal_compression nén chúng lại. Đo thật: bật wal_compression giảm WAL 17-30% tuỳ độ nén của dữ liệu, FPI vẫn còn nên vẫn an toàn. Tắt full_page_writes giảm 35% nhưng bỏ hẳn chống torn page — gần như không bao giờ nên làm. PostgreSQL 16.