DELETE FROM table WHERE uniqueField = 1
当MySQL找到uniqueField = 1
的行时,它会删除它。然后是否停止检查其他行,因为唯一字段只有一行值为1
?
或者,即使MySQL找到uniqueField = 1
行?
答案 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
,并且可以使用它来优化查询。它将在第一次删除后停止,直到结束才扫描。这不会复制,因为主设备和从设备上的行顺序不一定相同(即它有可能删除主设备和从设备上的不同行,导致数据偏差。)
您可以将DELETE
与LIMIT
和ORDER 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 ( ...)
,这也是复制安全的。