Một nguồn tốt để tham khảo trên FORCE INDEX sẽ là cuốn sách Thiết kế và điều chỉnh cơ sở dữ liệu MySQL .
Trên trang 120 đoạn 4, nó viết:
FORCE INDEX phù hợp ở đâu? FORCE INDEX (lần đầu tiên được kích hoạt trong phiên bản 4.0.9) rất giống với USE INDEX; sự khác biệt chính giữa hai tùy chọn là FORCE INDEX yêu cầu MySQL sử dụng chỉ mục (nếu có thể) thay vì quét bảng đắt tiền hơn, trong khi USE INDEX vẫn cho phép trình tối ưu hóa chọn quét bảng.
Cùng một trang nói rằng MySQL không cảnh báo rằng một chỉ mục là không liên quan và chuyển sang quét bảng trong trường hợp USE INDEX.
Do đó, FORCE INDEX có thể đưa Trình tối ưu hóa truy vấn MySQL ra khỏi phương trình trước khi sử dụng chỉ mục. Bất kỳ truy vấn nào sử dụng FORCE INDEX đúng cách sẽ làm giảm I / O. Tại sao tôi nói đúng?
Hãy suy nghĩ về nó. Nếu chỉ mục bạn chọn điều hướng qua là chỉ mục che phủ và bạn chỉ cần các cột như được liệt kê trong chỉ mục che phủ, việc liên hệ với bảng để lấy dữ liệu trở nên không cần thiết. Tất cả I / O được giới hạn trong các trang chỉ mục. Tất cả các dữ liệu được yêu cầu được lấy bằng cách thực hiện quét chỉ mục trong trường hợp xấu nhất. Đó thực sự là một điều tốt nếu dữ liệu được yêu cầu cần phải được đặt hàng, do đó bỏ qua mọi sắp xếp được yêu cầu.
Về mặt "quy tắc tham gia", FORCE INDEX chỉ nên được sử dụng khi
- đề cập đến các chỉ số bao gồm
- tất cả các cột trong chỉ mục có kích thước nhỏ
- bạn thực hiện hiệu quả hành vi lưu trữ của các truy vấn CHỌN
- Đối với các truy vấn adhoc, sử dụng SQL_NO_CACHE
- Đối với dữ liệu được cập nhật thường xuyên, bộ nhớ cache cẩn thận
FORCE INDEX không nên được thực hiện để buộc các truy vấn sử dụng các chỉ mục nếu bạn đang cố gắng khớp một chốt vuông trong một lỗ tròn. Nói cách khác, đi qua một chỉ mục để truy cập dữ liệu bảng theo một thứ tự cụ thể sẽ không mua gì cho bạn. Trong thực tế, nó ném hiệu năng truy vấn dưới xe buýt vì không thực hiện bất kỳ sự biết trước nào về mức độ sẵn có của dữ liệu của bạn.