Trong InnoDB, bất kỳ chỉ mục phụ nào bên trong đều chứa cột khóa chính của bảng. Vì vậy, chỉ mục tên trên cột (tên) là ngầm định trên các cột (tên, id).
Điều này có nghĩa là EXPLAIN hiển thị quyền truy cập của bạn vào bảng danh mục dưới dạng "quét chỉ mục" (điều này được hiển thị trong loại cột là "chỉ mục"). Bằng cách quét chỉ mục, nó cũng có quyền truy cập vào cột id, cột này sử dụng để tìm kiếm các hàng trong bảng thứ hai, mục.
Sau đó, nó cũng tận dụng chỉ mục mục trên (category_id) thực sự là (category_id, id) và nó có thể tìm nạp item.id cho danh sách lựa chọn của bạn chỉ bằng cách đọc chỉ mục. Không cần phải đọc bảng (điều này được hiển thị trong Thêm là "Sử dụng chỉ mục").
MyISAM không lưu trữ các khóa chính với khóa phụ theo cách này, vì vậy nó không thể có được các tối ưu hóa tương tự. Quyền truy cập vào bảng danh mục là loại "TẤT CẢ" có nghĩa là quét bảng.
Tôi mong đợi quyền truy cập vào mục bảng MyISAM sẽ là "ref" khi nó tra cứu các hàng bằng cách sử dụng chỉ mục trên (category_id). Nhưng trình tối ưu hóa có thể nhận được kết quả sai lệch nếu bạn có rất ít hàng trong bảng hoặc nếu bạn chưa thực hiện ANALYZE TABLE item
kể từ khi tạo chỉ mục.
Cập nhật lại:
Có vẻ như trình tối ưu hóa thích quét chỉ mục hơn quét bảng, vì vậy nó có cơ hội thực hiện quét chỉ mục trong InnoDB và đặt bảng danh mục trước. Trình tối ưu hóa quyết định sắp xếp lại các bảng thay vì sử dụng các bảng theo thứ tự bạn đã đưa ra trong truy vấn của mình.
Trong bảng MyISAM, sẽ có một bảng quét bất kỳ bảng nào nó chọn để truy cập đầu tiên, nhưng bằng cách đặt bảng danh mục thứ hai, nó tham gia vào chỉ mục chính CHÍNH của danh mục thay vì chỉ mục phụ của mục. Trình tối ưu hóa ưu tiên các tra cứu thành khóa duy nhất hoặc khóa chính (loại "eq_ref").