Я использую индексы по столбцам, по которым я выполняю поиск. Индексы создаются так:
CREATE INDEX index1 on <TABLE>(<col1> COLLATE NOCASE ASC)
CREATE INDEX index2 on <TABLE>(<col2> COLLATE NOCASE ASC)
CREATE INDEX index3 on <TABLE>(<col3> COLLATE NOCASE ASC)
Теперь запрос на выборку для поиска записей выглядит так:
select <col1> from <TABLE> where <col1> like '%monit%' AND <col2> like '%84%' GROUP BY <col1> limit 0,501;
Когда я запускаю EXPLAIN QUERY PLAN в моей базе данных sqlite следующим образом:
EXPLAIN QUERY PLAN select <col1> from <TABLE> where <col1> like '%monit%' AND <col2> like '%84%' GROUP BY <col1> limit 0,501;
Возвращает вывод в виде:
0 | 0 | 0 | ИНДЕКС СКАНИРОВАНИЯ ТАБЛИЦЫ ИСПОЛЬЗОВАНИЯ (~ 250000 строк)
и когда я отбрасываю индекс, выводится этот EXPLAIN QUERY PLAN:
0 | 0 | 0 | ТАБЛИЦА СКАНИРОВАНИЯ (~ 250000 строк)
0 | 0 | 0 | ИСПОЛЬЗУЙТЕ B-ДЕРЕВО ТЕМП ДЛЯ ГРУППЫ ПО
Разве число сканируемых строк (~ 250000 строк) не должно было быть меньше, если при поиске в таблице использовался индекс ???
Полагаю, проблема здесь в ключевом слове LIKE, потому что я где-то читал, что ключевое слово LIKE обнуляет использование индексов if ... Вот ссылка
РЕДАКТИРОВАТЬ: чтобы индексы работали с запросом, использующим LIKE, правая часть LIKE должна быть строковым литералом, который не начинается с символа подстановки. Итак, в приведенном выше запросе я попытался использовать параметр поиска в «как» без «%» в начале:
EXPLAIN QUERY PLAN select <col1> from <TABLE> where <col1> like 'monit%' AND <col2> like '84%' GROUP BY <col1> limit 0,501;
и вывод, который я получил, был таким:
0 | 0 | 0 | SEARCH TABLE partnumber ИСПОЛЬЗОВАНИЕ ИНДЕКСА model_index_partnumber (модель>? AND модель
Итак, вы видите. Количество строк, в которых выполняется поиск (а не сканирование), составляет (~ 15625 строк).
Но проблема в том, что я не могу покончить с джокером% в начале. Любой, пожалуйста, предложите мне альтернативный способ достижения того же ....
EDIT:
Я пытался использовать FTS3 из терминала, но когда я набрал этот запрос:
CREATE VIRTUAL TABLE <tbl> USING FTS3 (<col_list>);
Ошибка его выдачи:
Ошибка: нет такого модуля: FTS3
Кто-то, пожалуйста, помогите мне включить FTS3 из терминала, а также XCode (нужны шаги, которые я должен выполнить для обеих задач).
Я использую sqlcipher и уже выполнил это с терминала:
CFLAGS="-DSQLITE_ENABLE_FTS3=1" ./configure
EDIT:
Пожалуйста, посетите вопрос Таблица sqlite занимает время для извлечения записей в LIKE-запросе , опубликованном мной
EDIT:
Привет, все, я добился определенного успеха. Я изменил свой запрос select, чтобы он выглядел так:
select distinct description collate nocase as description from partnumber where rowid BETWEEN 1 AND (select max(rowid) from partnumber) AND description like '%a%' order by description;
И, Бинго, время поиска было как никогда раньше. Но проблема сейчас в том, что когда я выполняю команду EXPLAIN QUERY PLAN следующим образом, она показывает, что я использую B-Tree для разных, которые я не хочу использовать.
explain query plan select distinct description collate nocase as description from partnumber where rowid BETWEEN 1 AND (select max(rowid) from partnumber) AND description like '%a%' order by description;
Выход:
0|0|0|SEARCH TABLE partnumber USING INTEGER PRIMARY KEY (rowid>? AND rowid<?) (~15625 rows)
0|0|0|EXECUTE SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE partnumber USING INTEGER PRIMARY KEY (~1 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT