sqlite улучшить скорость запроса - PullRequest
0 голосов
/ 02 октября 2019

У меня есть sqlite-запрос, который генерируется динамически, например:

SELECT * FROM gsmr_data WHERE test_id='86' AND device='devicename' AND id<4371808 AND (metric='C2' OR metric='C2_N1' OR metric='C2_N2' OR metric='C2_N3' OR metric='C2_N4' OR metric='C2_N5' OR metric='C2_N6') ORDER BY id DESC LIMIT 500

Где идентификатор основан на последнем результате, а метрика (в части ИЛИ) добавляется динамически.

Моя таблица выглядит так:

enter image description here

И у меня есть следующие индексы в таблице:

enter image description here

Запрос занимает много времени (7 секунд в браузере sqlite db)

Есть ли что-нибудь еще, что я могу сделать, чтобы улучшить скорость запроса?

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Вы тестируете несколько столбцов, но ваши индексы рассчитаны только на один столбец, поэтому будет использоваться только один из них (см. Вывод EXPLAIN QUERY PLAN , чтобы узнать, какой из них; выполняется ANALYZE может изменить тот, который использует планировщик запросов).

Использование многостолбцового индекса может повысить производительность за счет ограничения общего количества просматриваемых строк (но, конечно, как и все индексы,требует увеличения времени на вставку, удаление и обновление строк, а также занимает больше места).

Сначала я бы посмотрел на добавление индекса для всех столбцов, используемых в WHERE:

CREATE INDEX idx_gsmr_data ON gsmr_data(test_id, device, metric, id)

См. документацию по оптимизатору запросов , почему id является последним в индексе. Также см. Команду .expert оболочки sqlite3 для указания индексов для запросов и обзор того, как sqlite использует индексы .

1 голос
/ 02 октября 2019

Вы можете попробовать

SELECT * FROM gsmr_data
WHERE test_id='86' AND device='devicename' AND id<4371808 AND
   metric in('C2', 'C2_N1', 'C2_N2', 'C2_N3', 'C2_N4', 'C2_N5', 'C2_N6')
ORDER BY id DESC LIMIT 500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...