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

Index trên bảng phân vùng PostgreSQL: lan xuống, unique phải chứa khóa, và dựng không khóa

Index tạo trên bảng cha phân vùng tự lan xuống mọi partition và partition mới cũng thừa kế. Nhưng unique/primary key BẮT BUỘC chứa khóa phân vùng. Đo thật: unique thiếu khóa phân vùng báo lỗi, duplicate bị chặn ở mức partition, và cách dựng index không khóa dài bằng ON ONLY + CONCURRENTLY + ATTACH. 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 5 phút

pg_stat_user_tables trong PostgreSQL: tìm bảng thiếu index qua seq scan

pg_stat_user_tables đếm mỗi bảng bị quét tuần tự hay dùng index bao nhiêu lần. Bài này đo thật: một bảng 1 triệu dòng bị 20 truy vấn quét tuần tự đọc 20 triệu dòng, thêm index thì về 0 seq scan. Và vì sao 100% seq scan trên bảng nhỏ lại hoàn toàn bình thường. PostgreSQL 16.

Công cụ 22/09/2026 6 phút

Ba vùng của Git: working directory, index (staging) và repository

Ai cũng gõ git add rồi git commit, nhưng ít người biết index (staging) thực chất là gì. Bài này mổ xẻ ba vùng của Git bằng lệnh thật: index là một file nhị phân lưu SHA blob + mode + path, git add ghi blob mới và cập nhật index, và hai lệnh diff soi hai khe khác nhau — hiểu điều này giúp bạn đọc đúng git status và dùng đúng git reset.

Lập trình 22/09/2026 6 phút

Index B-tree: vì sao tạo index rồi vẫn Seq Scan — bẫy non-sargable và cách viết query cho đúng

Bạn tạo index nhưng query vẫn chậm và EXPLAIN vẫn báo Seq Scan? Vì predicate không sargable — chỉ cần bọc cột trong một hàm là index nằm im vô dụng. Bài này đo thật trên bảng 1 triệu dòng: WHERE email=x dùng index (0.045ms), nhưng lower(email)=x quét cả bảng (54.857ms); age+1=31 chậm 12ms còn age=30 chỉ 1ms; và một bất ngờ — LIKE 'x%' với index thường vẫn Seq Scan, phải dùng text_pattern_ops.

Lập trình 22/09/2026 6 phút

Index tổ hợp: thứ tự cột quyết định query nào dùng được, và covering index xoá luôn việc đọc bảng

Một index nhiều cột không phải muốn dùng sao cũng được — quy tắc leftmost prefix quyết định query nào tận dụng được nó. Bài này đo thật trên bảng 2 triệu dòng: index (user_id, created_at) giúp query lọc user_id (0.037ms) nhưng bó tay với query chỉ lọc created_at (Seq Scan 54ms); đổi thứ tự cột cho cùng query nhanh 14 lần; và covering index INCLUDE(payload) cho Index Only Scan với Heap Fetches=0 — trả lời trọn query mà không chạm bảng.