为什么SQLite索引不加速查询?

时间:2012-03-23 16:32:51

标签: sql performance sqlite indexing

我写了这个查询:

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 列是主键。在这种情况下,为什么索引不能提高性能?

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

1 个答案:

答案 0 :(得分:4)

如果两个表中的任何一个表中都没有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)

上添加索引