我有以下问题:
SELECT * FROM messages GROUP BY peer
(实际上连接更复杂,但为了简单起见,我在这里省略了它们)
问题是SQLite不使用任何索引,并始终执行表的完整扫描。预计,它在小型数据集上运行速度很快,但是包含数千行的大型表格显然很慢。这是EXPLAIN QUERY PLAN命令的输出:
0|0|0|SCAN TABLE messages USING INDEX messages_peer_mid (~1000000 rows)
尽管它说“使用索引”它仍然执行完整扫描。有没有办法让SQLite使用索引进行此查询,或者最好放弃GROUP BY并寻找其他方法?
答案 0 :(得分:0)
该计划考虑了数据量并执行扫描,因为它的算法可能会更快地完成它。
其他评论,您的查询没有WHERE条件,并且您要返回所有列,那么为什么您不期望进行表扫描?
答案 1 :(得分:0)
索引有助于从表中选择记录(使用WHERE
子句或JOIN
操作的结果)。 {<1}}是在 之后的一组记录上执行的,这些记录是从表中选择并检索的。索引不能协助它。
如果您想了解有关查询中可供索引使用的选项的更多信息,请发布整个查询。
另外,您注意到您提供的SQL是您正在运行的代码的符号表示,但如果您真的使用GROUP BY
,或者除了以外的任何非聚合字段名称在您的陈述中*
您可能无法获得所需的结果。
最后,你问&#34;最好放弃GROUP BY并寻找其他方法?&#34; peer
用于SQL中的特定函数(从非聚合数据生成新的聚合结果集)。如果这是您的目标,那么GROUP BY
可能是最好的解决方案(因为它遵循数据库引擎,这是高度优化并且认识到数据库统计数据有关如何检索和处理数据的决定) 。如果这不是您的目标,并且您尝试使用GROUP BY
作为&#34;方法&#34;做其他事情。对于其他功能,请告诉我们您实际想要实现的目标。