我写了这个查询:
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 列是主键。在这种情况下,为什么索引不能提高性能?
感谢您的回答并抱歉我的英语不好:(。
答案 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)