【发布时间】:2014-04-01 11:03:50
【问题描述】:
我有一个大约 mysql 数据库。 1 TB 数据。表fuelinjection_stroke 有apprx。 1.000.000.000 行。 DBID 是主键,每次插入都会自动加一。
我正在尝试使用一个非常简单的语句删除前 1.000.000 行:
Delete from fuelinjection_stroke where DBID < 1000000;
在我的专用 8 核 Xeon 服务器(32 GB 内存,SAS 存储)上,此查询需要很长时间(>24 小时)。
知道这个过程是否可以加快速度吗?
【问题讨论】:
-
10 亿行是相当多的。除了 pkey 之外,您的桌子上有任何索引吗?当您删除行时,必须更新索引,这可能需要时间。我不确定它在这种情况下是否有效,但您能否尝试在事务中进行删除,看看效果是否更好?
-
对于 OP,您能否向我们介绍一下结果,我真的很感兴趣。 :)
-
删除速度很慢。以 10.000 的部分删除的方法有效 - 但这并没有加快整个过程。我最终做了以下事情:我使用 mysqldump 将表转储到一个文件中。然后我使用 sed -i '1,1000000d' file.sql 从转储文件中删除行。我截断了表格并重新加载了转储文件……结果证明这是最快的方法……
-
OP 在对 Uriil 的回答的评论中提到“表上没有任何索引或外键”。显然,如果您的 WHERE 条件使用的是没有索引的列,那么 MySQL 必须扫描整个 TABLE 以确保它具有
DBID < 1000000的所有行。而如果DBID上有一个索引,MySQL 就不必这样做。 -
在这种情况下会删除多少行?如果超过 30% 的行,那么最好将剩余的 70% 复制到新表中,然后将新表重命名为原始表,并将原始表重命名为旧表,然后删除旧表。