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.