gpt4 book ai didi

mysql - 删除大量行

转载 作者:行者123 更新时间:2023-11-30 00:42:05 26 4
gpt4 key购买 nike

我有 3 个 MyISAM 表,每个表大约有 1 亿行。

Table1 structure is (region, id,timestamp)
Table2 structure is (region, id, data1, data2)
Table3 structure is (region, id, data3, data4)

Table1 PK is (region,id)
Table2 PK is (region,id,data1)
Table3 PK is (region,id,data3)

每个表大小约为3Gb

我想删除 (region, id) 与超过 7 天前的时间戳关联的所有行。 (约占表格的15%)

我尝试了两种方法,但都不满意。

  • 首先,我使用 JOIN 进行了一些多表删除。 12小时后,它仍在运行。
  • 其次,我对第一个表进行了选择,以获取我必须删除的所有 (region,id),然后对每个表进行 10,000 个批量删除。为此,语法基本上是: DELETE FROM table WHERE (region,id) IN ((region1,id1),(region1,id2)...) 这个方法看起来真的很慢(每个请求 60 秒),而且,当我这样做时一个解释,PK没有被使用(!!)。

我尝试禁用 table2 和 table3 上的索引,但它似乎并没有显着提高这些查询的性能。

此外,如果查询花费太多时间,我希望能够让它不锁定它正在处理的表,以便我可以同时在此表上执行其他操作(仅限 INSERT)。

那么,您有什么建议,或者有什么最佳实践吗?

最佳答案

您是否尝试过使用游标,它可以一次删除一条记录?例如,

DELIMITER $$
DROP PROCEDURE IF EXISTS delete_using_cursor$$
CREATE PROCEDURE delete_using_cursor()
BEGIN
declare done int default false;
declare pk int;
declare c cursor for select [id] from [table] where [conditions];
declare continue handler for not found set done = true;
set @strSQL = 'delete from [table] where [id] = ?';
prepare stmt from @strSQL;
open c;
read_loop: loop
fetch c into pk;
if done then
leave read_loop;
end if;
set @pk = pk;
execute stmt using @pk;
end loop;
close c;
deallocate prepare stmt;
END $$
DELIMITER ;

关于mysql - 删除大量行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com