Cơ sở dữ liệu 29/08/2026 9 phút

Câu 0,007 ms mỗi lần ngốn gấp ba lần thời gian máy chủ so với câu 118 ms — và vì sao bạn sẽ tối ưu nhầm

Sau năm mươi ba phần đo từng cơ chế, phần này đo cách tìm ra chỗ nào đáng đo. Kết quả đầu tiên đã đủ giật mình: cách xếp hạng phổ biến nhất — theo thời gian mỗi lần — dẫn thẳng tới việc tối ưu nhầm truy vấn, bỏ qua đúng câu đang chiếm nhiều tài nguyên nhất.

Cơ sở dữ liệu 29/08/2026 10 phút

Cột mảng nhỏ hơn bảng phụ 4 lần — nhưng tra một thẻ chậm 57 lần, và không khoá ngoại nào chặn được thẻ ma

PostgreSQL cho một cột chứa cả mảng hoặc cả bản ghi con, tránh được một bảng phụ và một phép nối. Tôi đo cái giá của việc tránh đó bằng bài toán gắn thẻ cho bài viết — gọn hơn thật, nhưng mất Index Only Scan, mất khoá ngoại, và dữ liệu mồ côi tích lại mà không gì phát hiện.

Cơ sở dữ liệu 29/08/2026 9 phút

Sao chép đồng bộ ăn mất 37% thông lượng — và một khe sao chép bỏ quên đủ làm sập cả máy chính

Máy dự phòng là thứ ai cũng dựng và ít ai đo. Tôi dựng một cặp máy chính – máy dự phòng thật, đo độ trễ dưới tải (dưới 3 ms), rồi cố tình làm nó hỏng theo hai cách hay gặp nhất trên máy chủ thật — trong đó có một khe sao chép âm thầm giữ WAL tới khi đầy đĩa.

Cơ sở dữ liệu 28/08/2026 13 phút

Cập nhật một cột không nằm trong chỉ mục nào — vẫn chậm gấp 5 lần vì sáu chỉ mục khác

Đo chi phí thật của chỉ mục thừa trong PostgreSQL: chèn chậm 4,6 lần, cập nhật chậm 5 lần dù cột được sửa chẳng nằm trong chỉ mục nào. Và ba lý do khiến idx_scan = 0 không đủ để kết luận nên xoá — kèm cách xoá an toàn bằng giao dịch thử.

Cơ sở dữ liệu 28/08/2026 12 phút

Chỉ mục nhỏ hơn B-tree 6.850 lần — nhưng xáo trộn thứ tự dòng một cái là nó chậm hơn cả không có chỉ mục

Đo B-tree, BRIN và GiST trên bảng sự kiện 10 triệu dòng trong PostgreSQL: BRIN chỉ 32 kB, gần như miễn phí lúc ghi, nhưng nó đánh chỉ mục bố cục vật lý chứ không phải dữ liệu — xáo trộn thứ tự dòng là nó chậm 234 lần, và chết hoàn toàn trong im lặng.

Cơ sở dữ liệu 28/08/2026 12 phút

Chỉ mục HASH nhỏ hơn B-tree 8,8 lần với khoá dài — nhưng chỉ cần một câu ORDER BY là nó thành đồ bỏ

Đo HASH, SP-GiST và bloom trên PostgreSQL 16: HASH nhỏ hơn B-tree 8,8 lần với khoá dài vì nó chỉ lưu vân tay 4 byte thay vì cả khoá, nhưng nó chỉ biết dấu bằng — mất thứ tự, mất ràng buộc duy nhất. Và vì sao B-tree vẫn là mặc định đúng sau mười tám phần đo.