Nói chung:
1. Không thêm chỉ mục trừ khi bạn thực sự cần.
Mỗi chỉ mục làm cho việc ghi chậm hơn ...
2. Một chỉ mục sẽ được sử dụng trên mệnh đề where:
-- index on foo (bar)
select bar from foo where bar = :bar;
Bằng cùng một mã thông báo, nó sẽ được sử dụng trong các tham chiếu khóa ngoại (trên cả hai bảng).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3. Một chỉ mục sẽ được sử dụng để sắp xếp, đặc biệt khi được gắn với một giới hạn:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4. Chỉ mục nhiều cột đôi khi hữu ích khi cả 2 và 3. đều áp dụng.
Trong trường hợp này, hãy đặt điều kiện where trước và khóa sắp xếp sau cùng:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5. Luôn cập nhật thống kê bảng của bạn.
Nếu thống kê bảng là rác, có rất ít khả năng trình tối ưu hóa sẽ sử dụng các chỉ mục của bạn. Hút bụi / phân tích cơ sở dữ liệu của bạn theo cách thủ công nếu cần.
6. Việc sử dụng chỉ mục phụ thuộc vào sự phân vùng lại bảng của bạn.
Quá một ngưỡng nhất định của các hàng được truy xuất, việc quét toàn bộ bảng sẽ nhanh hơn. Nếu chỉ mục của bạn nằm trên trường boolean mà ít nhiều chia bảng của bạn thành hai, nó sẽ không bao giờ được sử dụng.
Tương tự như vậy, nếu dữ liệu của bạn được lưu trữ theo cách mà quá trình quét chỉ mục có khả năng kết thúc truy cập ngẫu nhiên vào trang đĩa gần như chưa bao giờ có thể áp dụng cho bảng đó, thì người lập kế hoạch sẽ thích quét toàn bộ bảng hơn.
7. Xem xét các chỉ mục một phần / biểu thức khi có sẵn.
Nếu bạn có một trường có cùng giá trị ngoại trừ 10% số hàng của bạn, hãy xem xét chỉ mục một phần trên đó (tức là không phải giá trị đó). Điều này dẫn đến một chỉ mục nhỏ hơn nhiều mà không cản trở tính hữu dụng thực tế của nó.
Nếu bạn liên tục truy vấn một biểu thức được áp dụng cho cột của mình và nền tảng của bạn cung cấp các chỉ mục biểu thức, hãy xem xét thêm một chỉ mục vào đó. Khi được sử dụng, biểu thức sẽ không được đánh giá cho mỗi hàng.