我写了这个查询:
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)
上添加索引