Báo cáo EXPLAIN được biết là khó diễn giải. Họ đã nạp quá nhiều thông tin vào một vài trường. Bạn có thể thử
type: index
cho biết nó đang thực hiện quét chỉ mục , có nghĩa là nó đang truy cập mọi mục nhập trong chỉ mục.
Thao tác này truy cập cùng một số lượng mục nhập như quét bảng, ngoại trừ nó dựa trên chỉ mục phụ thay vì chỉ mục được phân cụm (chính).
Khi chúng tôi thấy type: index
, EXPLAIN hiển thị possible_keys: NULL
có nghĩa là nó không thể sử dụng bất kỳ chỉ mục nào để tìm kiếm hiệu quả. Nhưng nó cũng hiển thị key: add_time
có nghĩa là chỉ mục mà nó sử dụng để quét chỉ mục là add_time
.
Việc quét chỉ mục là do MySQL không thể tự tối ưu hóa các biểu thức hoặc hàm gọi. Ví dụ:nếu bạn cố gắng tìm kiếm các ngày với một tháng cụ thể, bạn có thể tìm kiếm month(add_time) = 4
nhưng điều đó sẽ không sử dụng chỉ mục trên add_time vì các ngày có tháng đó nằm rải rác trong chỉ mục, không phải tất cả được nhóm lại với nhau.
Bạn có thể biết rằng date(add_time)
sẽ có thể được tìm kiếm bằng chỉ mục, nhưng MySQL không đưa ra suy luận đó. MySQL chỉ thấy rằng bạn đang sử dụng một hàm và nó thậm chí không cố gắng sử dụng chỉ mục.
Đó là lý do tại sao MySQL 5.7 đã giới thiệu các cột được tạo để cho phép chúng tôi lập chỉ mục một biểu thức và MySQL 8.0 đã làm cho nó tốt hơn bằng cách cho phép chỉ mục để xác định cho một biểu thức mà không yêu cầu chúng tôi xác định cột đã tạo trước.