我有下表:
CREATE TABLE notes (noteId INTEGER PRIMARY KEY ASC, note, note_length, count, unique(note) on conflict abort)
它包含300万行。
然后我执行以下命令:def getDistintNoteCountList(note_length):
with sqlite3.connect(r'./note_database') as connection:
cursor = connection.cursor()
cursor.execute('select distinct count from notes where note_length = ?', [note_length])
return [i[0] for i in cursor]
但是,此函数执行需要30秒,其中返回的列表大小约为20.考虑到我有300万条记录或者我做错了什么,这是否合理?
谢谢,
百里
修改
添加了:
cursor.execute("create index countIndex on notes (count)")
cursor.commit()
并将数据重新加载到数据库中。它似乎仍然很慢。
答案 0 :(得分:2)
解决方案通过优化。
在count
上设置一个index,它会更快。
答案 1 :(得分:2)
由于查询的where子句涉及note_length,并且需要count字段,因此最佳索引将是(note_length,count)。这是一个覆盖索引btw,但我不确定sqlite是否能够在这种情况下利用它。
sqlite查询计划解释in this page
答案 2 :(得分:1)
尝试不仅在count
列上创建复杂索引,还在count
和note_length
列上创建复杂索引。
答案 3 :(得分:0)
为了让DISTINCT做它做的事情,它必须执行一个排序,以便它可以删除重复项。根据基础表/查询结果集大小以及可用的索引(如果有),这通常是一个昂贵的步骤。
我不是SQLlite专家,但如果这是一个循环执行多次的嵌套查询,它就会刺痛。另外,SELECT DISTINCT COUNT完全正确吗?当然COUNT只返回一个值,根据定义,它是不同的吗?
这两点都可能是tosh。不过,我肯定会问自己我的表是否被正确编入索引。是否DISTINCT是必要的。