我有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
我想删除超过7天前与(time,id)时间戳关联的所有行。 (约占表格的15%)
我尝试了两种方法,但没有一种方法令人满意。
我试图禁用table2和table3上的索引,但它似乎没有大幅改善这些查询的性能。
此外,如果查询花费太多时间,我希望能够让它不锁定它正在处理的表,这样我就可以同时对该表执行其他操作(仅限INSERT)。 / p>
那么,你有什么建议,或者有没有最好的做法呢?
答案 0 :(得分:0)
您是否尝试过使用游标,可以一次删除一条记录?例如,
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 ;