使用条件uniqueField = 1从表中删除行

时间:2011-03-28 12:07:47

标签: mysql sql

DELETE FROM table WHERE uniqueField = 1

当MySQL找到uniqueField = 1的行时,它会删除它。然后是否停止检查其他行,因为唯一字段只有一行值为1

或者,即使MySQL找到uniqueField = 1行?

,MySQL仍会继续搜索

2 个答案:

答案 0 :(得分:4)

如果uniqueField被声明为UNIQUE,则会创建一个隐式索引来监控唯一约束。

MySQL很可能会使用此索引来查找要删除的记录。

由于此索引为UNIQUE,因此引擎只扫描一条记录。

如果该字段未声明为唯一且未编入索引,则MySQL必须扫描所有记录以检查此字段的值。

答案 1 :(得分:3)

操作取决于索引的存在以及索引的类型。

如果uniqueField是UNIQUE索引的一部分,MySQL将使用索引来定位匹配的行,该行最多可以是一行,并将其删除。

如果uniqueField是INDEX非唯一索引的一部分,它将使用索引来定位匹配的行,可以是0,1或更多,并删除它们。

如果uniqueField不是任何索引的一部分,则需要从前到后扫描整个表。即使它找到一行,它也会继续扫描表直到结束。

MySQL支持使用DELETE子句LIMIT的{​​{1}}扩展名DELETE FROM sometable WHERE uniqueField = 1 LIMIT 1,并且可以使用它来优化查询。它将在第一次删除后停止,直到结束才扫描。这不会复制,因为主设备和从设备上的行顺序不一定相同(即它有可能删除主设备和从设备上的不同行,导致数据偏差。)

您可以将DELETELIMITORDER BY一起使用,使再次安全复制,增加了排序成本:DELETE FROM sometable WHERE uniqueField = 1 ORDER BY id LIMIT 1

或者您可以先SELECT id FROM sometable WHERE uniqueField = 1,然后构建一个ID列表和DELETE FROM sometable WHERE id IN ( ...),这也是复制安全的。