UNIQUE KEY `ID_UNIQUE` (`ID`),
замедляет модификации до readings
. Это избыточный , поскольку `PRIMARY KEY является уникальным ключом. Брось.
Делайте IODKU только на одну вставляемую строку, а не на все строки:
insert into extremes(Date, Sensor_ID, `min`, `max`)
VALUES(... , ..., ..., ...) -- Place constants here (from the sensor)
on duplicate key update
`min` = LEAST(`min`, values(`min`)),
`max` = GREATEST(`max`, values(`max`);
Затем сделайте ночную работу, чтобы установить среднее значение.
Таким образом, вы касаетесь 1 ряда, а не до 1440.
Другой метод - собрать показания за минуту, а затем применить их в одном запросе.
У вас есть миллионы датчиков? Переосмыслите использование 4-байтового INT
для Sensor_ID
; есть целые числа поменьше.
Где вы нашли эти датчики? Я сомневаюсь, что вам нужно больше, чем 7 значащих цифр FLOAT
(4 байта) вместо 8-байтового DOUBLEs
.
Моя точка зрения о типах данных заключается в том, что сжатие данных также ускорит процесс, особенно если вы достигнете того, что слишком много данных для кэширования в ОЗУ.
Фразировка: «Sensor_ID и Date как первичные ключи» подразумевают, что есть два разных PK, что невозможно. Вместо этого «Sensor_ID и Date образуют составной первичный ключ». И да, это то, что вам нужно для этого стола. Ставите ли вы Date
первым или последним, зависит от того, какой типичный SELECT
.
FOREIGN KEYs
- другая стоимость. Каждый раз, когда вставка выполняется, необходимо проверить другую таблицу, чтобы проверить существующий идентификатор. К настоящему времени вы достаточно отладили свой код; ФК, возможно, пустая трата.
avg
можно вычислять каждую минуту, но (1) это несколько бессмысленно, пока день не закончится, и (2) потребуется дополнительный столбец (с подсчетом).