2013-07-05 23 views
0

我有类似的情况,像下面的问题。SQLite - 在GROUP BY中选择没有索引的列

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时选择的所有列。

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

+0

只是为了清楚起见,是CID,newcolumn分组的第二个查询? – AnatolyS

+0

@AnatolyS,只是cid – yhpark

回答

1

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

添加未编制索引的列时,必须在索引和表格中查找每条记录。 此外,表中记录的顺序不可能与索引中的顺序相同,因此表格的页面不按顺序读取,而是多次读取,这意味着缓存将无法正常工作。

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

TL;博士:没有