在 mysql innodb 中使用单个事务可以删除多少条记录
how many records can be deleted using a single transaction in mysql innodb
我想每 6 个月使用主键和外键从 10 个相关表中删除旧记录。我计划在单个事务块中执行此操作,因为如果出现任何故障,我必须回滚更改。我的查询将是这样的
DELETE FROM PARENT_TABLE WHERE PARENT_ID IN (1, 2, 3,etc);
DELETE FROM CHILD_TABLE1 WHERE PARENT_ID IN (1, 2, 3,etc);
要删除的记录将在100万条左右。在一次交易中删除所有这些是否安全?表现如何?
编辑
更清楚地回答我的问题。我会详细说明我的执行计划
I am first retreiving primary keys of all the records from the parent table which has to be deleted and store it to a temporary table
START TRANSACITON
DELETE FROM CHILD_ONE WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
DELETE FROM CHILD_TWO WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
DELETE FROM PARENT_TABLE WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
COMMIT;
任何失败回滚。
考虑到我可以从所有这些表中删除大约一百万条记录,将所有内容放在一个事务块中是否安全?
我相信首先你必须将数据移动到另一个数据库中然后
使用单个事务删除所有 10 table 这非常安全,可以立即回滚并在用户交互非常少时从实时数据库中删除数据 more info
首先:创建一个适当的备份并在开始删除记录之前对其进行测试
您请求的记录数主要取决于您的数据库服务器的配置(硬件)。您必须测试一下,可以在该特定服务器上毫无问题地删除多少条记录。从例如开始1000 条记录然后在每次迭代中增加数量,但它似乎太慢了。如果您有复制,设置和从服务器的性能也会影响行号(太多的写请求可能会导致复制严重延迟)。
建议:在开始删除之前,尽可能删除所有外键和索引(主键和与您用于执行操作的 where 子句相关的索引除外)。
编辑:
如果要删除的记录数大于不删除的记录数,考虑直接复制记录到一个新的table,然后将旧的和新的重命名tables。第一步,使用CREATE TABLE .. LIKE
语句复制table的结构,然后删除所有不必要的索引和约束,复制记录,添加索引,然后重命名table。 (如有必要,将原始 table 中的最新记录复制到副本中),然后您可以删除旧的 table.
你很可能会成功。但这是不明智的。某些随机事件(例如,网络故障)可能会导致该笔巨额交易中止。您可能会长时间屏蔽其他 activity。等等
"old" 是否记录了日期 X 之前的所有内容?如果是这样, 将 PARTITIONing
用于 DROPping
旧行会更有效率。我们可以讨论细节。糟糕,您有 FOREIGN KEYs
,它与 PARTITIONing
不兼容。所有的表都有 FK 吗?
为什么要等 6 个月才进行删除?每天 6K 行会产生同样的效果,而且侵入性和风险要小得多。
IN ( SELECT ... )
性能很差,请改用 JOIN
。
如果一些表只是规范化,为什么要删除它们?
每笔交易删除 100 个 ID 是否可行?那会更安全,侵入性更小。
我想每 6 个月使用主键和外键从 10 个相关表中删除旧记录。我计划在单个事务块中执行此操作,因为如果出现任何故障,我必须回滚更改。我的查询将是这样的
DELETE FROM PARENT_TABLE WHERE PARENT_ID IN (1, 2, 3,etc);
DELETE FROM CHILD_TABLE1 WHERE PARENT_ID IN (1, 2, 3,etc);
要删除的记录将在100万条左右。在一次交易中删除所有这些是否安全?表现如何?
编辑
更清楚地回答我的问题。我会详细说明我的执行计划
I am first retreiving primary keys of all the records from the parent table which has to be deleted and store it to a temporary table
START TRANSACITON
DELETE FROM CHILD_ONE WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
DELETE FROM CHILD_TWO WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
DELETE FROM PARENT_TABLE WHERE PARENT_ID IN (SELECT * FROM TEMP_ID_TABLE);
COMMIT;
任何失败回滚。
考虑到我可以从所有这些表中删除大约一百万条记录,将所有内容放在一个事务块中是否安全?
我相信首先你必须将数据移动到另一个数据库中然后 使用单个事务删除所有 10 table 这非常安全,可以立即回滚并在用户交互非常少时从实时数据库中删除数据 more info
首先:创建一个适当的备份并在开始删除记录之前对其进行测试
您请求的记录数主要取决于您的数据库服务器的配置(硬件)。您必须测试一下,可以在该特定服务器上毫无问题地删除多少条记录。从例如开始1000 条记录然后在每次迭代中增加数量,但它似乎太慢了。如果您有复制,设置和从服务器的性能也会影响行号(太多的写请求可能会导致复制严重延迟)。
建议:在开始删除之前,尽可能删除所有外键和索引(主键和与您用于执行操作的 where 子句相关的索引除外)。
编辑:
如果要删除的记录数大于不删除的记录数,考虑直接复制记录到一个新的table,然后将旧的和新的重命名tables。第一步,使用CREATE TABLE .. LIKE
语句复制table的结构,然后删除所有不必要的索引和约束,复制记录,添加索引,然后重命名table。 (如有必要,将原始 table 中的最新记录复制到副本中),然后您可以删除旧的 table.
你很可能会成功。但这是不明智的。某些随机事件(例如,网络故障)可能会导致该笔巨额交易中止。您可能会长时间屏蔽其他 activity。等等
"old" 是否记录了日期 X 之前的所有内容?如果是这样, 将 PARTITIONing
用于 DROPping
旧行会更有效率。我们可以讨论细节。糟糕,您有 FOREIGN KEYs
,它与 PARTITIONing
不兼容。所有的表都有 FK 吗?
为什么要等 6 个月才进行删除?每天 6K 行会产生同样的效果,而且侵入性和风险要小得多。
IN ( SELECT ... )
性能很差,请改用 JOIN
。
如果一些表只是规范化,为什么要删除它们?
每笔交易删除 100 个 ID 是否可行?那会更安全,侵入性更小。