IN
е нещо като между =
и "диапазон". Така че се заяждам със заглавието на въпроса. Два диапазона е практически невъзможно да се оптимизират; IN
плюс диапазон има някакъв шанс за оптимизиране.
Въз основа на
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
Бих предоставил 2 индекса и бих оставил оптимизатора да реши кой да използва:
INDEX(MarkedForDeletion, StartedAt, DeviceId)
INDEX(MarkedForDeletion, DeviceId, StartedAt)
Някои по-нови версии на MySQL/MariaDB могат да надскочат и да използват всичките 3 колони в втората индекс. Във всички версии първите 2 колони на всеки индекс го правят кандидат. Изборът може да се ръководи от статистически данни и може (или не) да е „правилният“ избор.
Тъй като AlarmId
не може да бъде NULL
, използвайте шаблона:COUNT(*)
.
След като направя тази промяна, всеки от моите индекси "покрива", като по този начин дава допълнителен тласък на производителността.