【问题标题】:SQLite refusing to use better index?SQLite 拒绝使用更好的索引?
【发布时间】: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。不过,可能还有更优雅的解决方案。
  • 分析工作,谢谢!!!请重新发布作为答案,以便我接受:)

标签: sqlite query-optimization


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

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

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 2013-11-15
    • 1970-01-01
    • 2013-11-09
    • 2014-10-05
    • 1970-01-01
    • 2013-05-28
    • 2012-04-16
    • 2013-10-26
    相关资源
    最近更新 更多