选择distinct对于大型数据库需要很长时间

时间:2011-12-26 12:43:40

标签: sql sqlite

我有下表:

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()

并将数据重新加载到数据库中。它似乎仍然很慢。

4 个答案:

答案 0 :(得分:2)

解决方案通过优化。

count上设置一个index,它会更快。

答案 1 :(得分:2)

由于查询的where子句涉及note_length,并且需要count字段,因此最佳索引将是(note_length,count)。这是一个覆盖索引btw,但我不确定sqlite是否能够在这种情况下利用它。

sqlite查询计划解释in this page

答案 2 :(得分:1)

尝试不仅在count列上创建复杂索引,还在countnote_length列上创建复杂索引。

答案 3 :(得分:0)

为了让DISTINCT做它做的事情,它必须执行一个排序,以便它可以删除重复项。根据基础表/查询结果集大小以及可用的索引(如果有),这通常是一个昂贵的步骤。

我不是SQLlite专家,但如果这是一个循环执行多次的嵌套查询,它就会刺痛。另外,SELECT DISTINCT COUNT完全正确吗?当然COUNT只返回一个值,根据定义,它是不同的吗?

这两点都可能是tosh。不过,我肯定会问自己我的表是否被正确编入索引。是否DISTINCT是必要的。