Python sqlite3没有使用带LIKE的索引

时间:2016-06-15 21:12:26

标签: python indexing sqlite

我有一个包含单列的表,我以两种方式查询:

  • 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格式。

1 个答案:

答案 0 :(得分:1)

documentation说:

  

如果右侧是绑定到字符串的parameter,则仅当包含表达式的prepared statement使用sqlite3_prepare_v2()或{{编译}时才会尝试此优化3}}。如果右侧是sqlite3_prepare16_v2()并且语句是使用parametersqlite3_prepare()准备的,则不会尝试LIKE优化。

旧版本的pysqlite模块使用sqlite3_prepare()