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

Điều kiện OR làm mất index trong PostgreSQL: khi nào, vì sao, và cách cứu

OR không tự động giết index — nó chỉ nhanh bằng nhánh chậm nhất. Đo thật: OR trên hai cột có index cho BitmapOr 0,09 ms, nhưng chỉ một nhánh thiếu index kéo cả câu thành Seq Scan toàn bảng 48 ms. Và vì sao index gộp phục vụ AND mà không phục vụ OR. PostgreSQL 16.

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

Hàm bọc quanh cột làm mất index trong PostgreSQL: lower(), date() và cách gỡ

Index lưu giá trị cột, không lưu giá trị của hàm. Bọc lower(email) hay date(tao_luc) quanh cột trong WHERE khiến index thành vô dụng. Đo thật: lower(email) chạy Seq Scan 160 ms so với 0,036 ms; date(tao_luc) 47,6 ms so với 0,433 ms khi viết lại thành khoảng. Index biểu thức và điều kiện sargable. PostgreSQL 16.

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

Ép kiểu ngầm định làm mất index trong PostgreSQL: hàm ẩn quanh cột

So sánh cột với sai kiểu dữ liệu khiến PostgreSQL chèn ép kiểu — và nếu nó ép vế cột, index chết. Đo thật: int8 so với numeric literal chạy Seq Scan 55 ms so với 0,04 ms; hướng ép quyết định tất cả. Cách đọc EXPLAIN để phát hiện và cách sửa. PostgreSQL 16.

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

Khóa ngoại có cần index không trong PostgreSQL: có, và nó không tự tạo

PostgreSQL tự tạo index cho PRIMARY KEY và UNIQUE nhưng KHÔNG cho cột khóa ngoại. Đo thật: thiếu index đó, xóa một dòng cha phải quét cả 5 triệu dòng con (179 ms so với 0,7 ms), và JOIN cha con seq scan 52 ms so với 0,17 ms. Vì sao, và khi nào vẫn bỏ được. PostgreSQL 16.

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

HOT update trong PostgreSQL: cập nhật một dòng mà không đụng index

HOT (Heap-Only Tuple) cho UPDATE tạo phiên bản mới ngay trong cùng trang, không cập nhật index nào — nếu không đổi cột được index và trang còn chỗ. Đo thật: update cột không index đạt 100 phần trăm HOT giữ index nguyên, update cột có index 0 phần trăm HOT làm index phình. PostgreSQL 16.

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.