Предыстория: запустил mysensors на raspberry pi2, спустя какое-то время стал замечать что периодически не срабатывают команды. При недолгом поиске в логе, обнаружил:
Код: Выделить всё
Expire send set rollback : NL_service.command=0,5
Благо код открытый - начал разбираться... Выяснилось что такие сообщения могут появляться в логе, когда модуль не успевает отправить сообщение за отведенное время (дефолтно 2 сек.). Дальнейший анализ выявил торможения при вызове функции
setProperty, а точнее той ее части, где она чистит историю. Вот подтверждение из лога медленных запросов:
Код: Выделить всё
# Query_time: 2.968386 Lock_time: 0.000378 Rows_sent: 0 Rows_examined: 132731
SET timestamp=1453233305;
DELETE FROM phistory WHERE VALUE_ID='658' AND TO_DAYS(NOW())-TO_DAYS(ADDED)>30;
Проверил, индекс на VALUE_ID есть, добавил еще на ADDED, немного ускорилось, но не значительно.
Собственно теперь сам вопрос/предложение: (я уже видел где-то на форуме, но поиском не нашел) Возможно ли реализовать хранение истории похожим образом как rrd, когда свежие показания наиболее детальны, а более старые хранятся укрупненно? Таким образом заметно снизится размер таблицы phistory и ускорятся запросы к ней.
Как вариант, в системе можно заменить параметр "Хранить историю дней" на параметр "Сценарий хранения". Последние можно будет предустановить в настройках, например следующим образом в 3 градации:
от 0 до 1 дня - хранить все записи
от 1 до 7 дней - хранить с интервалом 1 час
от 7 до 365 дней - хранить с интервалом 1 день
А само "сжатие" истории вынести в отдельный скрипт, который бы запускался скажем раз в сутки, а не при каждом установке свойства.