Điều đầu tiên cần biết là MySQL chỉ sử dụng một chỉ mục cho mỗi psuedo-SELECT (không phải câu lệnh) - khi bạn xem đầu ra của SELECT bằng cách sử dụng EXPLAIN, bạn sẽ thấy chỉ mục nào đã được chọn. EXPLAIN chỉ có thể chạy trên SELECTS, vì vậy chúng tôi phải giả định rằng DELETE / UPDATE đang sử dụng cùng một gói khi bạn hoán đổi cú pháp cho SELECT ...
Hầu hết các cơ sở dữ liệu (những cơ sở dữ liệu được nhúng có thể là kỳ lạ) theo hiểu biết của tôi hỗ trợ việc sử dụng các chỉ mục trong các mệnh đề sau:
- CHỌN
- THAM GIA (cú pháp ANSI-92)
- WHERE (vì có cả ANSI-89 và lọc ở đây)
- HAVING (tương đương WHERE, nhưng không giống với WHERE - cho phép sử dụng tổng hợp mà không cần truy vấn con)
- ĐẶT HÀNG THEO
Tôi không 100% trên GROUP BY, vì vậy tôi đang bỏ qua nó.
Cuối cùng, đó là sự lựa chọn của trình tối ưu hóa cho những gì sẽ sử dụng dựa trên thuật toán của nó và số liệu thống kê mà nó có sẵn. Bạn có thể sử dụng cú pháp BẢNG PHÂN TÍCH để làm mới thống kê (vui lòng định kỳ, không liên tục).
Phụ lục
MySQL cũng giới hạn dung lượng để phân bổ chỉ mục - 1.000 byte cho bảng MyISAM và 767 byte cho bảng InnoDB . Vì MySQL chỉ sử dụng một chỉ mục cho mỗi psuedo-SELECT, nên việc bao gồm các chỉ mục (chỉ mục bao gồm nhiều hơn một cột) là một ý tưởng hay nhưng nó thực sự là để kiểm tra truy vấn phổ biến nhất và tối ưu hóa nó tốt nhất có thể. Ưu tiên lập chỉ mục phải là:
- Khóa chính (ở đâu đó trong phiên bản v5, việc tạo chỉ mục cho pk đã trở thành tự động)
- Khoá ngoại (ứng cử viên có khả năng cao nhất là THAM GIA tiếp theo
- Tiêu chí lọc (giả sử bạn có không gian)