优化没有索引的表的删除查询?

时间:2012-11-07 10:34:27

标签: mysql sql database relational-database

假设我们有以下表格: 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值的行。这需要10分钟。 2)然后我们运行语句DELETE FROM t WHERE IN(我们试图删除的值,其中15个是准确的) 这大约需要6个小时。

所以我的猜测是第二步需要很长时间,因为对于t中的每个元组,我们将a的值与查询列表中的每个值进行比较。那么我们如何优化这个查询以获得相同的结果,但更快!?

1 个答案:

答案 0 :(得分:0)

如果使用连接对于CRUD操作将更快而不是使用IN或子查询

例如:

DELETE FROM t 
INNER JOIN S ON t.a = S.a 

希望这有帮助