IN
nằm giữa =
và một 'phạm vi'. Vì vậy, tôi phân minh với tiêu đề trên Câu hỏi. Hai phạm vi hầu như không thể tối ưu hóa; một IN
cộng với một phạm vi có một số cơ hội tối ưu hóa.
Dựa trên
WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)
AND `StartedAt` < FROM_UNIXTIME(1518998400)
AND `DeviceId` IN (
UNHEX('00030000000000000000000000000000'),
UNHEX('000300000000000000000000000181cd'),
UNHEX('000300000000000000000000000e7cf6'),
UNHEX('000300000000000000000000000e7cf7'),
UNHEX('000300000000000000000000000f423f')
) AND `MarkedForDeletion` = FALSE
Tôi sẽ cung cấp 2 chỉ mục và để Trình tối ưu hóa quyết định sử dụng chỉ mục nào:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Một số phiên bản MySQL / MariaDB mới hơn có thể đi tắt đón đầu và sử dụng tất cả 3 cột trong giây mục lục. Trong tất cả các phiên bản, 2 cột đầu tiên của một trong hai chỉ mục làm cho nó trở thành một ứng cử viên. Sự lựa chọn có thể được thúc đẩy bởi số liệu thống kê và có thể (hoặc có thể không) là sự lựa chọn 'đúng đắn'.
Kể từ AlarmId
không thể là NULL
, sử dụng mẫu:COUNT(*)
.
Sau khi thực hiện thay đổi đó, mỗi chỉ mục của tôi sẽ "phủ sóng", do đó tăng thêm hiệu suất.