【发布时间】:2018-12-16 01:47:47
【问题描述】:
我有一个单列表,我通过两种方式查询:
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)用于第二个查询。
这一切都很好,但后来我添加了 python3 的 sqlite3 模块,然后开始在那里查询,它适用于原始字符串,但是当我使用参数绑定时,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')]
我在这里做错了什么?由于这是一个序列化后端而不是 webapp 数据库,我猜使用原始字符串时的威胁不那么严重,但我更愿意使用正确的 SQL 格式。
【问题讨论】: