JuniorKỹ thuậtSQL
Nên index những cột nào và không nên index những cột nào?
Thử trả lời trước
Đáp án mẫu
Index giúp đọc nhanh hơn theo một cột nhưng tốn dung lượng đĩa và làm chậm mọi câu INSERT, UPDATE, DELETE, vì index cũng phải được cập nhật. Vì vậy chỉ index những gì query thực sự dùng.
Ứng viên tốt:
- Cột trong các
WHEREchạy thường xuyên và chỉ trả về một phần nhỏ của bảng. - Cột join, nhất là foreign key. PostgreSQL không tự index foreign key, còn MySQL InnoDB thì có.
- Cột dùng trong
ORDER BYhoặcGROUP BYtrên tập kết quả lớn, tốt nhất là nằm trong composite index.
Ứng viên kém:
- Cột selectivity thấp như boolean hoặc status chỉ có 3 giá trị, vì planner vẫn sẽ quét cả bảng. Partial index vẫn có ích khi một giá trị rất hiếm.
- Bảng rất nhỏ, nơi một lần scan vốn đã rẻ.
- Cột hiếm khi được query, hoặc bị ghi liên tục.
CREATE INDEX idx_orders_customer_id ON orders (customer_id);
Hãy nhìn vào query thật và plan của chúng, không nhìn vào tên cột, và xóa những index mà thống kê cho thấy chưa bao giờ được dùng.
Ý chính
- Index các cột dùng trong filter, join và sort
- Mỗi index làm chậm ghi và tốn dung lượng
- Cột selectivity thấp hiếm khi được lợi
- Foreign key cần được index trong PostgreSQL
Câu hỏi nối tiếp thường gặp
- Làm sao tìm các index chưa bao giờ được dùng?
Lỗi thường gặp
- Index mọi cột cho chắc ăn
- Quên index các cột foreign key dùng để join