SQLite拒绝使用更好的索引?

时间:2012-12-06 16:07:23

标签: sqlite query-optimization

架构:

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相同。

1 个答案:

答案 0 :(得分:1)

  1. 运行ANALYZE(在任何特定情况下可能有帮助,也可能没有帮助);或
  2. 使用INDEXED子句强制使用特定索引(尽管documentation警告不要这样做):

    SELECT ID FROM Groups INDEXED BY GroupTime WHERE ...
    
  3. 或更新到SQLite 3.7.15(发布时),它具有查询规划器优化功能,使其能够识别使用GroupTime更有效。