Финальная табличка:
CREATE TABLE gpslogm (
unixtime UInt64,
client_id UInt64,
managers_id Array(UInt64)
gps_lon Float64
gps_lan Float64
gps_time Uint64
server_date Date
)
ENGINE=MergeTree
PARTITION BY toYYYYMM(server_date)
ORDER BY=(unixtime,managers_id)
CREATE TABLE gpslog AS gpslogm ENGINE = Buffer(default, gpslogm, 16, 2, 10, 1000, 10000, 100000, 1000000)
Вводные данные:
Клиенты (пусть будет 100 000) присылают в течении 2 минут минимум по 1 логу gps координат. (833 в секунду) каждый клиент отбрабатывается в отдельном потоке с отдельным INSERT
Менеджеры (пусть будет 50 000) один раз в 10 минут считывают адресованные им свежии логи клиентов (83 в секунду) по запросу:
SELECT * FROM gpslog WHERE has(managers,1111222233330999) AND unixtime > 10282376867
Администратор один раз в час делает выборку всех точек которые находятся в заданном радиусе в определенном промежутки времени (gps_time).
Данные старше трех месяцев из таблицы удаляются (server_date для партиционирования)
Вопрос:
1. Можно ли использовать таблицу типа Buffer в данном контексте
2. Стоит ли делать партиционироване по дням и изменить запрос SELECT на SELECT * FROM gpslog WHERE has(managers,1111222233330999) AND unixtime > 10282376867 AND server_date > *somedate
4. Что еще необходимо настроить для более быстрой работы (SSD, размер данных не играет определяющею роль)
PARTITION BY toYYYYMM(toDateTime(intDiv(unixtime,1000))
ORDER BY unixtime
в partition нужен unixtime чтобы отсекать партиции при where unixtime >
массив в индексе не нужен, не будет использоваться, только память жрать
ORDER BY unixtime я бы заменил на ORDER BY intDiv(unixtime,1000*60) чтобы сократить размер индекса, но это тестить надо.