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

标签 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 中具有相同 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/

相关文章:

php - 为什么在 Laravel 的 Controller 中没有正确重定向 if else?

mysql - 用于选择仅包含给定颜色书籍的图书馆书架的 SQL 命令

sql - 使用来自另一个表的随机值更新 SQL 表(无连接条件)

mysql - 在sql中使用两个检查约束

php - 为整个数据库导入单个 MySQL .sql 文件 |未选择数据库错误

java - 'forUpdate().fetchAny(condition)' 会只锁定一行还是多行?

c# - 为什么我无法通过对表执行第二个查询来将第二个结果添加到列表框? SQL

php - 如何在 doctrine2 中找到实体

php - 使用 SQL 表中的数据填充下拉列表?

sql - 使用连接查询从四个不同的表中获取记录