Python sqlite3 verwendet keinen Index mit LIKE

Ich habe eine Tabelle mit einer einzelnen Spalte, die ich auf zwei Arten abfrage:

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

Damit diese Abfragen einen Index verwenden, benötige ich anscheinend zwei Indizes (einen für jeden Abfragetyp):

CREATE INDEX test_nocol ON sequences(seqs) für die erste Abfrage.CREATE INDEX seqs_index ON sequences(seqs COLLATE NOCASE) für die zweite Abfrage.

Das ist alles schön, aber dann füge ich das sqlite3-Modul von python3 hinzu und beginne dort stattdessen mit der Abfrage, was mit rohen Zeichenfolgen funktioniert, aber wenn ich Parameterbindungen verwende, wird dasCOLLATE index wird plötzlich nicht mehr verwendet:

>>> 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')]

Was mache ich hier falsch? Da es sich um ein Serialisierungs-Backend und nicht um eine Webapp-DB handelt, ist die Bedrohung bei der Verwendung von unformatierten Zeichenfolgen wahrscheinlich geringer, aber ich würde lieber die richtige SQL-Formatierung verwenden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage