Lee Hinde Asked: 2011-11-29 17:04:20 +0800 CST2011-11-29 17:04:20 +0800 CST 2011-11-29 17:04:20 +0800 CST 在 400 万行的 92K 上运行 DELETE 查询的最佳方法是什么? 772 我想到的选项: 一个大删除语句。例如: delete from x where (y = 'x' and x = 'y') or (y = 'a' and x = 'b') 和上面一样,但是分成小块,一次 10k? 创建一个存储过程,所以我发送的只是两个查询值。 mysql delete 3 个回答 Voted Best Answer Simon Righarts 2011-11-29T17:13:17+08:002011-11-29T17:13:17+08:00 4M 中的 92K 仍然只占您记录的 2.3%。我建议您的第一个选择,只需将要删除的内容扔到数据库中,然后让数据库对其进行整理(如果您一次将其全部提供给数据库,则可能会比打包它更有效出去)。我唯一建议将其分块的情况是,如果您的应用程序对时间要求很高,并且您担心会减慢它的速度(在这种情况下,另一种解决方案是在下班时间进行)。 如果您从表中取出 20-30% 或更多的记录,我建议删除索引、执行删除和重新创建索引,然后是OPTIMIZE TABLE,但对于表中 2% 的记录,索引重建开销是不值得的(在删除记录的同时保持索引是最新的会更快)。 也就是说,在您完成删除后,运行OPTIMIZE TABLE可能不是一个坏主意 - 但不要在高峰时段这样做。 Dave Rix 2011-11-30T13:55:20+08:002011-11-30T13:55:20+08:00 我总是使用DELETE QUICK而不是 just DELETE,因为它在删除期间对索引的工作较少,然后在稍后阶段当您有机会优化表时,留下的索引叶子会被收集起来。 我当然建议您阅读文档DELETE QUICK以查看它是否有帮助。 http://dev.mysql.com/doc/refman/5.5/en/delete.html Rob Farley 2011-11-30T02:17:57+08:002011-11-30T02:17:57+08:00 您要确保您的计划是寻找感兴趣的记录。因此,首先使用适当的索引将其作为 SELECT 很好地运行。 如果执行 DELETE 所涉及的锁定很痛苦,那么请分批执行。但是,如果您的查询正在扫描表,那么使用批处理将最终导致多次扫描表。
4M 中的 92K 仍然只占您记录的 2.3%。我建议您的第一个选择,只需将要删除的内容扔到数据库中,然后让数据库对其进行整理(如果您一次将其全部提供给数据库,则可能会比打包它更有效出去)。我唯一建议将其分块的情况是,如果您的应用程序对时间要求很高,并且您担心会减慢它的速度(在这种情况下,另一种解决方案是在下班时间进行)。
如果您从表中取出 20-30% 或更多的记录,我建议删除索引、执行删除和重新创建索引,然后是
OPTIMIZE TABLE
,但对于表中 2% 的记录,索引重建开销是不值得的(在删除记录的同时保持索引是最新的会更快)。也就是说,在您完成删除后,运行
OPTIMIZE TABLE
可能不是一个坏主意 - 但不要在高峰时段这样做。我总是使用
DELETE QUICK
而不是 justDELETE
,因为它在删除期间对索引的工作较少,然后在稍后阶段当您有机会优化表时,留下的索引叶子会被收集起来。我当然建议您阅读文档
DELETE QUICK
以查看它是否有帮助。http://dev.mysql.com/doc/refman/5.5/en/delete.html
您要确保您的计划是寻找感兴趣的记录。因此,首先使用适当的索引将其作为 SELECT 很好地运行。
如果执行 DELETE 所涉及的锁定很痛苦,那么请分批执行。但是,如果您的查询正在扫描表,那么使用批处理将最终导致多次扫描表。