Ghost Condition (Điều kiện “ma”) - Giúp database mà không thay đổi kết quả
Kỹ thuật thông minh khi bạn biết logic nghiệp vụ mà database không thể tự suy ra: thêm điều kiện “thừa” vào query - không thay đổi kết quả nhưng giúp database tận dụng index tốt hơn.
Ví dụ: tìm kiện hàng đang mở có bảo hiểm vận chuyển
-- Query gốc:
SELECT * FROM shipments
WHERE status = 'open' AND transportinsurance = 1;
-- Index hiện có: (status, type). Cột transportinsurance không nằm trong index nào.Nhưng theo quy tắc nghiệp vụ: chỉ kiện hàng loại 3, 6, 11 mới được phép mua bảo hiểm vận chuyển. Nghĩa là transportinsurance = 1 ⟹ chắc chắn type IN (3, 6, 11):
-- Thêm điều kiện "ma": không thay đổi kết quả
SELECT * FROM shipments
WHERE status = 'open'
AND transportinsurance = 1
AND type IN (3, 6, 11); -- ← điều kiện "ma"Không có điều kiện "ma":
Index (status, type) → chỉ dùng được status='open'
→ Quét TẤT CẢ kiện hàng đang mở (hàng chục nghìn) → lọc từ bảng → chậm
Có điều kiện "ma":
Index (status, type) → dùng ĐƯỢC CẢ HAI cột!
→ Thu hẹp phạm vi quét xuống còn vài nghìn dòng → nhanh hơn nhiềuKhi nào dùng?
Khi bạn biết mối quan hệ logic giữa các cột (ví dụ: “loại A chỉ xuất hiện khi trạng thái là X”) mà database không thể tự suy ra - những quan hệ đến từ quy tắc nghiệp vụ, không được mã hóa trong schema.
⚠️ Cảnh báo
Nếu quy tắc nghiệp vụ thay đổi (ví dụ: sau này mọi loại kiện hàng đều được mua bảo hiểm), điều kiện “ma” sẽ lọc SAI và trả về thiếu kết quả. Luôn ghi chú rõ trong code tại sao điều kiện đó tồn tại.
Liên quan
- Composite Index và Nguyên tắc Phễu - vì sao thêm equality giúp phễu hoạt động
- Biến Range thành Equality - kỹ thuật “chị em” cùng triết lý
- Inequality và Index - cách 1 (thêm equality thu hẹp) cùng tư duy