SQlite DB с одной таблицей и 60 000 000 записей.время выполнения простого запроса составляет более 100 секунд.
Я пытался перейти на postgeSQL, но его производительность была еще ниже.Не тестировал его на MySQL или msSQL.
Оболочка Я разделил таблицу (скажем, разные таблицы для каждого pointID - их несколько сотен? Или разные таблицы для каждого месяца - тогда у меня будет максимум 10 000 000 записей?)
sql схема:
CREATE TABLE `collectedData` (
`id` INTEGER,
`timeStamp` double,
`timeDateStr` nvarchar,
`pointID` nvarchar,
`pointIDindex` double,
`trendNumber` integer,
`status` nvarchar,
`value` double,
PRIMARY KEY(`id`)
);
CREATE INDEX `idx_pointID` ON `collectedData` (
`pointID`
);
CREATE INDEX `idx_pointIDindex` ON `collectedData` (
`pointIDindex`
);
CREATE INDEX `idx_timeStamp` ON `collectedData` (
`timeStamp`
);
CREATE INDEX `idx_trendNumber` ON `collectedData` (
`trendNumber`
);
Следующий запрос занял 107 секунд:
select * from collectedData
where
trendNumber =1
and status <> '' and
timestamp <=1556793244
and pointid in ('point1','point2','pont3','point4','point5','point6','point7','point8','point9','pointa')
and pointIDindex % 1 = 0
order by timestamp desc, id desc limit 5000
следующий запрос занял 150 секунд (меньше условий)
select * from collectedData
where
trendNumber =1
and status <> '' and
timestamp <=1556793244
and pointIDindex % 1 = 0
order by timestamp desc, id desc limit 5000
Редактирование: Asnwer из другого места - добавьте следующий индекс:
CREATE INDEX idx_All ON collectedData (trendNumber, pointid, pointIDindex, status, timestamp desc, id desc, timeDateStr, value)
улучшил производительность в 3 раза.
Редактирование # 2: предложение @Raymond Nijland: исполнениеПлан такой: ПОИСК ТАБЛИЦЫ ПАРАМЕТРОВ С ИСПОЛЬЗОВАНИЕМ ПОКРЫТИЯ ИНДЕКСА idx_All (trendNumber =? AND pointID =?) "" 0 "" 0 "" 0 "" ВЫПОЛНИТЬ СПИСОК СПИСОК 1 "" 0 "" 0 "" 0 "" ИСПОЛЬЗОВАТЬ ТЕМП. Б-ДЕРЕВОЗАКАЗАТЬ ПО "
и благодаря ему - используя эти данные, я изменил порядок правил в запросе на следующий:
select * from (
select * from collectedData
where
trendNumber =1
and status <> '' and
timestamp <=1556793244
and pointid in ('point1','point2','pont3','point4','point5','point6','point7','point8','point9','pointa')
and pointIDindex % 1 = 0
order by id desc limit 5000
) order by timestamp desc
это значительно улучшилось (дляменя это решило).