IN
adalah semacam antara =
dan 'kisaran'. Jadi, saya berdalih dengan judul pada Pertanyaan. Dua rentang hampir tidak mungkin untuk dioptimalkan; sebuah IN
ditambah rentang memiliki beberapa peluang pengoptimalan.
Berdasarkan
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
Saya akan memberikan 2 indeks dan membiarkan Pengoptimal memutuskan mana yang akan digunakan:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Beberapa versi MySQL/MariaDB yang lebih baru dapat melompati dan menggunakan ketiga kolom dalam kedua indeks. Di semua versi, 2 kolom pertama dari kedua indeks menjadikannya kandidat. Pilihannya mungkin didorong oleh statistik, dan mungkin (atau mungkin tidak) menjadi pilihan yang 'benar'.
Sejak AlarmId
tidak boleh NULL
, gunakan pola:COUNT(*)
.
Setelah melakukan perubahan itu, setiap indeks saya "menutupi", sehingga memberikan peningkatan kinerja ekstra.