SQLite - 在GROUP BY中选择非索引列

时间:2013-07-05 17:37:48

标签: sqlite

我有类似的情况,如下面的问题。

Mysql speed up max() group by

SELECT MAX(id) id, cid FROM table GROUP BY cid

要优化上述查询(在问题中显示),创建索引(cid,id)就可以了。

但是,当我添加一个没有索引到SELECT的列时,查询速度会急剧减慢。

例如,

SELECT MAX(id) id, cid, newcolumn FROM table GROUP BY cid

如果我创建索引(cid,id,newcolumn),查询时间将恢复到最小。我似乎应该在使用GROUP BY时索引我选择的所有列。

除了索引要选择的所有列之外,还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

当查询中使用的所有列都是索引的一部分(后来称为covering index)时,SQLite可以从索引中获取所有值,而不需要访问表本身。

添加未编制索引的列时,必须在索引和表中查找每条记录。 此外,表中记录的顺序不太可能与索引中的顺序相同,因此表的页面不按顺序读取,并且多次读取,这意味着缓存也不会起作用。 / p>

必须从表或索引中读取newcolumn值;没有其他机制来存储数据。

tl;博士:没有