【问题标题】:Why SQLite index is not speed up query?为什么 SQLite 索引不能加快查询速度?
【发布时间】:2012-03-23 16:32:50
【问题描述】:

我写了这个查询:

INSERT INTO KeysTable (KeyText, Id)
SELECT KeyText as BKT, KeysTable.ID as CID FROM KeysTable
INNER JOIN StatTable ON KeysTable.ID = StatTable.Key_ID
WHERE StatTable.StatCommandCode = 4 AND 
EXISTS (SELECT 1 FROM StatTable WHERE StatCommandCode = 4 AND StatTable.Key_ID = CID);

我知道删除条件

AND StatTable.Key_ID = CID

会使查询非常快。另外,如果我将其替换为

AND StatTable.Key_ID = 444 // (444 - random static number)

查询也会非常快。此条件下的两列均已编入索引:

CREATE INDEX IF NOT EXISTS StatsIndex ON StatTable (Key_ID);

KeysTable 中,ID 列是主键。为什么在这种情况下索引没有提高性能?

感谢您的回答,抱歉我的英语不好:(。

【问题讨论】:

  • 那个EXISTS子查询有什么用?
  • 两个字段的类型是否相同(INT?CHAR?)?
  • 那个 EXISTS 子查询似乎有点多余,因为你已经有了那个连接,不是吗?
  • StatTable.Key_ID 和 KeysTable.ID 具有相同的数据类型:[ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL //--- [Key_ID] integer NOT NULL
  • @Dmitriy:然后(仍然想知道这不会产生错误),您可以删除 EXISTS 子查询。您在 Join 中已经具备这些条件。

标签: sql performance sqlite indexing


【解决方案1】:

如果两个表中的任何一个都没有CID 列,那么EXISTS 子查询就没有用了。将语句改写为:

INSERT INTO KeysTable (KeyText, Id)
  SELECT KeyText
       , KeysTable.ID  
  FROM KeysTable
    INNER JOIN StatTable 
      ON KeysTable.ID = StatTable.Key_ID
  WHERE StatTable.StatCommandCode = 4 

如果还是慢,可以尝试在(StatCommandCode, Key_ID)上加个索引

【讨论】:

  • 我仍然对这是试图完成的事情感到困惑。您在KeysTable 中插入了一些数据,但这些数据已经存在......表中具有相同的行有什么意义?
  • 谢谢!仍然想知道为什么我之前使用存在:)(也许在我有另一个子查询之前 - 不知道)。存在是没用的,你是对的。
  • @Dmitriy:你能解释一下 Insert 语句试图做什么吗?它有什么用?
  • 这个插入看起来很浪费,因为我从表中删除了一些字段:)。
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2012-12-24
  • 2021-04-01
  • 2012-05-24
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多