我写了这个查询:

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

感谢您的回答,对不起我的英语不好:(。

最佳答案

如果两个表中的任何一个均没有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)上添加索引

10-07 20:55