【发布时间】:2014-01-09 17:37:39
【问题描述】:
我在 Internet 和 Stack Overflow 上搜索了我的问题,但找不到好的解决方案。
我有一个包含 300,000 行的表 (MySql MyISAM)(一列是 blob 字段)。
我必须使用:
DELETE FROM tablename WHERE id IN (1,4,7,88,568,.......)
IN 语法中有近 30,000 个 id。
大约需要 1 小时。此外,虽然我删除了 10% 的 .MYD 文件,但它并没有使文件变小,所以我运行 OPTIMIZE TABLE... 命令。它也持续很长时间......(我应该使用它,因为磁盘空间对我来说很重要)。
如上删除数据并恢复空间时,有什么方法可以提高性能? (增加缓冲区大小?哪个?还是其他?)
【问题讨论】:
-
最好将这些 ID 填充到临时表中,然后执行删除/连接查询。
-
与查询一起使用基本上会强制检查每行被删除的每个值。在删除实际运行之前,您可能会扫描 30,000 个 ID。
-
@MarcBs 和 @user2366842s cmets 是正确的。创建一个包含所有 ID 的临时表,然后
delete from tablename where id in (select id from temporarytable)可能有助于优化器提高速度。此外,考虑在删除之前删除索引(id 上的索引除外!)并在删除后重建它们可能比让删除不断更改它们更快。 -
另一个选项(不确定这有多可行,取决于您总共有多少记录)是如果表没有外键约束,您可以复制 ISN'T 中的所有内容将列表复制到临时表,在原始表上运行截断,然后将剩余的所有内容复制回来(假设这是一次性删除作业,而不是定期运行的东西)
标签: mysql optimization sql-delete