Python sqlite3 не использует индекс с LIKE

У меня есть таблица с одним столбцом, который я запрашиваю двумя способами:

SELECT * FROM sequences WHERE seqs="blablabla"SELECT * FROM sequences WHERE seqs LIKE "blablabla%"

Для этих запросов, чтобы использовать индекс, мне нужны два индекса (по одному для каждого типа запроса):

CREATE INDEX test_nocol ON sequences(seqs) для первого запроса.CREATE INDEX seqs_index ON sequences(seqs COLLATE NOCASE) для второго запроса.

Это все хорошо, но затем я добавляю модуль sqlite3 в python3 и вместо этого начинаю выполнять запросы, которые работают с необработанными строками, но когда я использую привязки параметров,COLLATE Индекс внезапно больше не используется:

>>> sql = 'explain query plan\n select seqs from sequences where seqs="blabla"'
>>> c3.execute(sql).fetchall()
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX test_nocol (seqs=?)')]
>>> sql = 'explain query plan\n select seqs from sequences where seqs=?'
>>> c3.execute(sql, ('hahahah',)).fetchall()
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX test_nocol (seqs=?)')]
>>> sql = 'explain query plan\n select seqs from sequences where seqs like "hahahah%"'
>>> c3.execute(sql).fetchall()
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX seqs_index (seqs>? AND seqs<?)')]
>>> sql = 'explain query plan\n select seqs from sequences where seqs like ?'
>>> c3.execute(sql, ('hahahah',)).fetchall()
[(0, 0, 0, 'SCAN TABLE sequences')]

Что я здесь не так делаю? Поскольку это серверная часть сериализации, а не БД веб-приложения, я думаю, угроза при использовании необработанных строк менее серьезна, но я бы предпочел использовать правильное форматирование SQL.

Ответы на вопрос(1)

Решение Вопроса

документация говорит:

Если правая частьпараметр который связан со строкой, то эта оптимизация предпринимается только в том случае, еслиподготовленное заявление содержащий выражение было скомпилировано сsqlite3_prepare_v2 () или жеsqlite3_prepare16_v2 (), Оптимизация LIKE не предпринимается, если правая частьпараметр и заявление было подготовлено с использованиемsqlite3_prepare () или жеsqlite3_prepare16 ().

Старые версии модуля pysqlite используютsqlite3_prepare().

 glormph16 июн. 2016 г., 11:58
Благодаря использованию pysqlite из PyPI вместо модуля python std library sqlite3 (v.2.6.0) это исправляется. К сожалению, я на Python3 и пакет pysqlite недоступен (пока).stackoverflow.com/a/23414147/1271862

Ваш ответ на вопрос