Sử dụng FORCE INDEX


7

Tôi đã có một bài thuyết trình gần đây được đưa ra bởi một kỹ sư MySQL của Facebook và anh ấy đã đề cập ở đó rằng việc sử dụng FORCE INDEXlàm giảm I / O.

Đó là điều cần làm với Trình tối ưu hóa truy vấn MySQL không cần phải truy cập từ điển dữ liệu và thực hiện các phép tính.

  • Bất cứ ai có thể giải thích làm thế nào điều này hoạt động (tốt nhất là với tài liệu tham khảo)?
  • Đây có phải là một thực hành tối ưu hóa tốt để làm theo nói chung?

4
Một truy vấn nhanh của Google đã xuất hiện bài đăng trên blog sau: Một trường hợp cho FORCE INDEX .
gonsalu

1
Tôi gần như chắc chắn rằng bất cứ điều gì Facebook làm để tối ưu hóa môi trường MySQL của họ đều được tính là tối ưu hóa cực kỳ và chuyên môn cao, chỉ mang lại lợi ích đáng chú ý ở quy mô lớn, khổng lồ của họ. Chi phí sử dụng FORCElà linh hoạt (trình tối ưu hóa của bạn bị ràng buộc) và thậm chí có thể là hiệu suất (nếu bạn chọn sai chỉ mục hoặc nếu số liệu thống kê thay đổi đáng kể). Tuy nhiên, tôi nghĩ rằng câu trả lời cho câu hỏi này nên có nhiều thông tin.
Nick Chammas

1
Xin chào Jonathan, để làm cho câu hỏi này phù hợp và hữu ích hơn với trang web (và giữ cho nó không bị đóng), tôi đã chỉnh sửa nó để thu hút thêm thông tin và khuyến nghị cụ thể, trái ngược với chỉ các liên kết.
Nick Chammas

Câu trả lời:


9

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 .

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.