我使用查询删除表中大约1/3的记录:
DELETE FROM `abc` LIMIT 10680000;
查询显示在状态为“更新”的进程列表中。总共有30万条记录。该表有5列和两个索引,当转储到SQL时,该文件大约为9GB。
这是MySQL中唯一的数据库和表。
这是在具有2GB内存,3 GHz四核处理器和快速SAS磁盘的计算机上运行。除了DELETE
操作之外,MySQL不执行任何读取或写入操作。机器上没有其他“重”进程。
此查询已运行超过2小时 - 我可以预计需要多长时间?
感谢您的帮助!我对MySQL很陌生,因此在运行此查询时,任何有关“引擎盖下”发生的事情的信息都非常受欢迎。
如果我能提供任何其他相关的信息,请告诉我。
更新:我刚刚运行了COUNT(*)
,在2小时内,它只删除了200k条记录。我想我将接受Joe Enos的建议,看看将数据插入新表并删除上一个表的效果如何。
更新2:抱歉,我实际上误读了号码。在2小时内,它不会被删除任何内容。我糊涂了。有什么建议吗?
更新3 :我最终使用mysqldump
--where "true LIMIT 10680000,31622302"
,然后将数据导入新表。然后我删除了旧表并重命名了新表。这花了半个多小时。
答案 0 :(得分:3)
不知道这是否会更好,但是可能值得考虑做以下事情: 创建一个新表并将原始表的2/3插入到新表中。 放下原始表格。 将新表重命名为原始表的名称。
这会阻止日志文件进行所有删除,但我不知道插入20m记录是否比删除10m更快。
答案 1 :(得分:3)
您应该发布表格定义。 另外,要知道为什么需要花费很多时间,请尝试通过以下方式在删除请求上启用配置文件模式:
SET profiling=1;
DELETE FROM abc LIMIT 10680000;
SET profiling=0;
SHOW PROFILES;
SHOW PROFILE ALL FOR QUERY X; (X is the ID of your query shown in SHOW PROFILES)
并发布它返回的内容(但我认为查询必须结束才能返回分析数据)
http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html
另外,我认为你会在ServerFault上获得更多回复;)
答案 2 :(得分:1)
当您运行此查询时,数据库的InnoDB日志文件用于记录已删除行的所有详细信息 - 如果此日志文件从一开始就不够大,则会自动扩展在必要时(如果配置这样做) - 我不熟悉具体细节,但我希望这种自动扩展不会非常快。 2小时似乎很长一段时间 - 但如果日志文件在查询运行时不断增长,我也不会感到惊讶。
是否在外键的末尾删除记录的表(即另一个表是否通过FK约束引用它)?
答案 3 :(得分:1)
我希望你的查询现在结束了... :)但是从我所看到的,LIMIT大数(我从未尝试过这种数字)非常慢。我会尝试基于pk的东西,如
DELETE FROM abc WHERE abc_pk < 10680000;