2015-04-24 2 views
5

Для моего случая мне нужно записать 15 показателей производительности для устройств и сохранить их в InfluxDB. Каждое устройство имеет уникальный идентификатор устройства.Производительность InfluxDB

Метрики записываются в InfluxDB следующим образом. Здесь я показываю только один пример:

new Serie.Builder("perfmetric1") 
    .columns("time", "value", "id", "type") 
    .values(getTime(), getPerf1(), getId(), getType()) 
    .build() 

Запись данных осуществляется быстро и легко. Но при выполнении запроса я видел плохую производительность. Я пытаюсь получить все 15 метрических значений за последний час.

select value from perfmetric1, perfmetric2, ..., permetric15 
where id='testdeviceid' and time > now() - 1h 

В течение часа каждая метрика имеет 120 точек данных, всего 1800 точек данных. Запрос занимает около 5 секунд на экземпляре EC4 c4.4xlarge, когда он неактивен.

Я считаю, что InfluxDB может сделать лучше. Это проблема дизайна моей схемы, или это что-то еще? Разве расщепление запроса на 15 параллельных вызовов будет быстрее?

ответ

2

Создайте индекс в столбце id. Похоже, что он использует полное сканирование в таблице для извлечения данных. Разделив запрос на 15 потоков, двигатель будет использовать 15 полных сканирований, и производительность будет намного хуже.

+0

Спасибо за быстрый ответ! Я довольно новичок в InfluxDB, в основном просто экспериментирую. Все это имеет смысл. Я немного удивлен, потому что это кажется очень распространенным случаем. Индексация индексов - это что-то новое для версии 0.9.0. На данный момент я запускаю стабилизатор 0.8.8. «Чтобы включить такие вещи, как теги и быстрый поиск по определенным значениям столбцов, мы добавим поддержку индексов столбцов. Вот вам и проблема отслеживания индексов столбцов». –

+0

программное обеспечение находится в альфа-состоянии разработки, поэтому многие вещи отсутствуют и много ошибок – valentin

4

Как ответ @valentin говорит, вам нужно создать индекс для столбца id для InfluxDB для эффективного выполнения этих запросов.

В 0.8 stable вы можете сделать это «индексирование» с помощью continuous fanout queries. Например, следующий непрерывный запрос будет расширить серию perfmetric1 в кратных рядов вида perfmetric1.id:

select * from perfmetric1 into perfmetric1.[id]; 

Позже вы могли бы сделать:

select value from perfmetric1.testdeviceid, perfmetric2.testdeviceid, ..., permetric15.testdeviceid where time > now() - 1h 

Этот запрос займет гораздо меньше времени, так как InfluxDB не потребуется выполнять полное сканирование таймсерий, чтобы получить очки за каждый testdeviceid.

Смежные вопросы