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` = FALSEI would provide 2 indexes and let the Optimizer decide which to use:
INDEX(MarkedForDeletion, StartedAt, DeviceId)INDEX(MarkedForDeletion, DeviceId, StartedAt)
一些较新的MySQL / MariaDB版本可以跳过并利用第二个索引中的所有3
列。在所有版本中,任一 索引的前2列均使其成为候选值。该选择可能受统计驱动,并且可能 (也可能不是)“正确”的选择。
既然
AlarmId不能NULL,请使用模式:
COUNT(*)。
进行更改后,我的每个索引都被“覆盖”了,从而使性能得到了进一步的提升。



