Tôi muốn thêm vào đây rằng các cơ sở dữ liệu khác nhau đòi hỏi các chiến lược khác nhau. Ví dụ, hãy so sánh MySQL w / InnoDB và PostgreSQL.
InnoDB
Các bảng InnoDB về cơ bản là một chỉ mục b-cây của khóa chính được mở rộng để bao gồm thông tin hàng trong mục nhập chỉ mục. Quét thứ tự vật lý không được hỗ trợ và tất cả các lần quét xảy ra theo thứ tự hợp lý. Điều này có nghĩa là hai điều:
Quét liên tiếp trong Innodb tạo ra rất nhiều I / O đĩa ngẫu nhiên và
Chỉ số khóa chính phải được duyệt qua bất kể người ta có sử dụng chỉ mục phụ hay không.
Tra cứu khóa chính nhanh hơn trong mô hình này so với bất kỳ phương pháp nào khác.
Trong trường hợp này, điều rất quan trọng là lập chỉ mục đủ các trường trong bảng nhiều trang. Quy tắc điển hình là lập chỉ mục mọi thứ bạn muốn lọc theo.
PostgreSQL
PostgreSQL sử dụng các tệp heap, một bảng cho mỗi tệp (một số bảng có thể là nhiều tệp) trong đó các bộ dữ liệu được phân bổ từ không gian trống của heap đó. Quét thứ tự vật lý được hỗ trợ. Để quét thứ tự hợp lý để làm việc, một chỉ mục phải được thêm vào.
Các khóa chính trong PostgreSQL về cơ bản là một tập hợp con của các chỉ mục duy nhất trong đó không có giá trị nào có thể là NULL. Các ràng buộc ĐỘC ĐÁO được thực hiện bằng cách sử dụng các chỉ mục ngầm định và một số loại chỉ mục khác được hỗ trợ với các hoạt động khác nhau có thể có trong chỉ mục.
Điều này có nghĩa là:
Tra cứu khóa chính, giả sử một tablerequire hợp lý đánh vào tệp chỉ mục và tệp bảng. Điều này chậm hơn đáng kể so với cách tiếp cận của MySQL trong đó chỉ mục phải được duyệt qua và hàng được chứa trong chỉ mục.
Quét thứ tự vật lý thực hiện tốt hơn nhiều, giảm I / O đĩa ngẫu nhiên trong đó số lượng hàng đáng kể sẽ được xử lý.
Quét chỉ mục phụ hoạt động tốt hơn so với MySQL vì chỉ có một chỉ mục phải được duyệt qua để đến phần vật lý của bảng.
Trong mô hình này, các chỉ mục thường là cần thiết nhưng người lập kế hoạch có nhiều tự do hơn khi sử dụng một chỉ mục và ý nghĩa của việc không sử dụng một chỉ mục thường ít nghiêm trọng hơn. Các bảng thường được tối ưu hóa nhiều hơn (thay vì chuyên về tra cứu pkey) và do đó cần ít chỉ mục hơn.
TL; DR
Biết RDBMS của bạn.