Если я вас правильно понимаю, вы надеетесь ускорить такой запрос.
SELECT something
FROM tbl
WHERE deviceID = constant
AND start <= UnixTimestamp
AND UnixTimestamp < end
AND Power >= constant
У вас есть один постоянный критерий (deviceID) и два критерия диапазона (UnixTimestamp и Power). Индексами MySQL являются BTREE (думаю, отсортированные по порядку), и MySQL может выполнять только одно сканирование диапазона индексов за SELECT.
Итак, вам, вероятно, следует выбрать индекс на (deviceID, UnixTimestamp, Power)
. Чтобы удовлетворить запрос, MySQL будет произвольно обращаться к индексу к записям для deviceID, а затем к произвольному доступу к первой строке, соответствующей критерию запуска UnixTimestamp.
Затем он будет сканировать индекс последовательно и использовать информацию Power из каждой записи индекса, чтобы решить, следует ли выбирать каждую строку.
Вы также можете использовать (deviceID, Power, UnixTimestamp)
. Но в этом случае MySQL найдет первую запись, соответствующую критерию устройства и мощности, а затем отсканирует индекс, чтобы просмотреть записи, которые будут иметь все временные метки, чтобы увидеть, какие строки следует выбрать.
Ваша цель производительности - заставить MySQL сканировать как можно меньше записей индекса, так что весьма вероятно, что выбор (deviceID, UnixTimestamp, Power)
лучше. Столбец индекса на UnixTimestamp, вероятно, более селективный , чем столбец на Power. (Это мое предположение.)
ALTER TABLE tbl CREATE INDEX tbl_dev_ts_pwr (deviceID, UnixTimestamp, Power);
Посмотрите на учебники Билла Карвина. Также посмотрите на https://use -the-index-luke.com * Маркуса Винанда