【发布时间】:2011-03-11 17:24:02
【问题描述】:
我正在使用查询删除表中大约 1/3 的记录:
DELETE FROM `abc` LIMIT 10680000;
查询出现在进程列表中,状态为“正在更新”。总共有 30m 条记录。该表有 5 列和两个索引,当转储到 SQL 时,文件大约 9GB。
这是 MySQL 中唯一的数据库和表。
这是在具有 2GB 内存、3 GHz 四核处理器和快速 SAS 磁盘的机器上运行的。 MySQL 不执行除此 DELETE 操作之外的任何读取或写入操作。机器上没有其他“繁重”进程正在运行。
此查询已运行超过 2 小时 -- 我预计需要多长时间?
感谢您的帮助!我对 MySQL 还是很陌生,所以任何关于运行此查询时“幕后”发生的事情的花絮都非常感谢。
如果我能提供任何其他相关信息,请告诉我。
更新:我刚刚运行了一个COUNT(*),在 2 小时内,它只删除了 20 万条记录。我想我会采纳 Joe Enos 的建议,看看将数据插入新表并删除前一个表的效果如何。
更新 2: 抱歉,我实际上误读了号码。在 2 小时内,它没有被删除任何内容。我糊涂了。有什么建议吗?
更新 3: 我最终将 mysqldump 与 --where "true LIMIT 10680000,31622302" 一起使用,然后将数据导入到新表中。然后我删除了旧表并重命名了新表。这花了半个多小时。
【问题讨论】:
-
你知道没有 ORDER BY 的 LIMIT 意味着它可以选择任意 1000 万条记录进行删除吗?
-
哦,谢谢你的提示。我只是想删除 1/3 的记录,所以没关系。会不会是和我只是查询
SELECT * FROM abc LIMIT 10680000;一样的记录集?该查询始终返回相同的记录集。表格有“自然顺序”吗? -
被删除的桌子上的PK是否有任何FK?这些可能会降低删除性能,因为数据库必须检查以确保在删除过程中没有违反这些。
-
btreat:不,没有。数据库中没有任何其他表——只有一张。不过感谢您的提示,我会记住这一点的。
-
不,表格没有定义的自然顺序。当然,数据在磁盘上确实有一些顺序,这就是为什么您始终获得相同记录的原因。不过,只要数据库喜欢它,这个顺序可能会改变,因此不能依赖它。
标签: mysql