Как создать индекс на основе выражений с помощью функции instr ()? - PullRequest
0 голосов
/ 02 марта 2019

С Sqlite3 я пытаюсь сделать запрос вроде:

select * from data
где instr (filepath, '. Txt')! = 0

И я хочучтобы проиндексировать этот запрос, чтобы ускорить его.

Я пытался создать такой индекс:

создать индекс data_instr_filepath для данных (instr (filepath, '. txt'));

Однако «план запроса объяснения» все еще показывает, что я выполняю сканирование таблицы.

Это выполнимо в sqlite?Примеры, которые я нашел для создания индексов на основе выражений, по-видимому, ограничены функцией длины и умножением двух столбцов.

ОБНОВЛЕНИЕ:

Благодаря ответу Майка я изменил свой запрос наиспользовать неравенства и смог создать индекс, который попадает в него.Ниже приведены мои индексы, которые я использовал в итоге:

create index data_instr_filepath_txt on data(instr(filepath,'.txt'));

create index data_instr_filepath_substr on data(substr(filepath,0,instr(filepath,'.')));

1 Ответ

0 голосов
/ 02 марта 2019

Причина в том, что индекс, скорее всего, не будет использоваться для неравенства согласно: -

Аналогично, столбцы индекса обычно не будут использоваться (для целей индексации), если они находятся справастолбца, который ограничен только неравенствами. Обзор оптимизатора запросов SQLite

Вы можете попробовать принудительно использовать индекс, используя INDEXED BY .Однако в вашей ситуации это не сработает из-за того, что индекс помечен как недоступный для использования.(запрос все еще будет работать)

например,

EXPLAIN QUERY PLAN
SELECT * FROM data INDEXED BY data_instr_filepath
WHERE instr(filepath,'.txt') != 0

приводит к: -

нет решения для запроса Время: 0 с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...