假设我们有以下表格: r(a, b, c) 其中 a 是某个整数,表格有 50 行 s(d, e, f, a) s.a 是 t.a 上的外键。 每个元组是 400 字节,s 是一个多重集,因为这是一个 SQL 数据库。 s 拥有大约 100 万个元组。 当添加一个表时,数据库服务器会自动在表中的主键列上创建一个索引,例如 t 在 a 上有一个索引。但是,Oracle 不会在作为外键的列上创建索引。所以 s 没有索引。 我们想从 t 中删除 15 行。所以这就是我们所做的: 1) 我们从 s 中删除在 t 中具有相同 a 值的行。这需要 10 分钟。 2) 然后我们运行语句 DELETE FROM t WHERE a IN(我们试图删除的值,准确地说是 15 个) 这大约需要 6 个小时。
所以我的猜测是第二步需要很长时间,因为对于 t 中的每个元组,我们正在将 a 的值与查询列表中的每个值进行比较。那么我们如何才能优化此查询以获得相同的结果但速度更快!?
最佳答案
如果使用 join 进行 CRUD 操作会比使用 IN 或子查询更快
例如:
DELETE FROM t
INNER JOIN S ON t.a = S.a
希望对你有帮助
关于mysql - 优化没有索引的表的删除查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13267870/