【发布时间】:2012-12-06 16:07:23
【问题描述】:
架构:
CREATE TABLE [Groups] ([Group] VARCHAR(50) NULL, [ArtNum] INTEGER NULL, [ID] VARCHAR(50) NULL, [Time] INTEGER);
CREATE INDEX [GroupTime] ON [Groups] ([Group], [Time] DESC);
CREATE INDEX [GroupArtNum] ON [Groups] ([Group], [ArtNum]);
我想优化以下查询:
SELECT `ID` FROM `Groups` WHERE `Group`=? ORDER BY `Time` DESC LIMIT 1
问题是 SQLite 坚持使用GroupArtNum 索引而不是GroupTime 索引。 EXPLAIN QUERY PLAN 打印以下内容:
SEARCH TABLE Groups USING INDEX GroupArtNum (Group=?) (~10 rows)
USE TEMP B-TREE FOR ORDER BY
有趣的是,如果我尝试按ArtNum 而不是Time 进行排序,它会运行得非常快。
Time 列中只有(64 位)整数,与 ArtNum 相同。
【问题讨论】:
-
你试过运行
ANALYZE吗? -
如果
ANALYZE不能解决这个问题,将Time放入查询应该 欺骗它。像这样的东西:WHERE Group=? AND Time>=0。不过,可能还有更优雅的解决方案。 -
分析工作,谢谢!!!请重新发布作为答案,以便我接受:)