方式一:

delete from tablename limit 2000;

  • 对于一张表中数据量特别大的情况,不能使用 delete from tablename 这样会出现连接超时类的错误,使用 limit
    在后面加上数量的限制这样就不会出现超时的错误,但需要多次手动提交删除任务,并且limit后面的数量也不能太大,要选择一个合适的量;
  • 这样虽然可以删除数据,但效率很慢,为了提升删除的效率,我们可以先删除这个表中的索引,除了我们删除的where条件字段中的索引,等我们删除完数据后再加上索引
  • 如果这个表中没有需要的数据了,我们可以复制这个表的结构,然后再删除这个表,删除表比删除数据快的多。
  • 为了避免多次手动提交删除任务,我们可以写一个sql循环,将删除语句放入循环中,将sql提交到服务器,由服务器执行,这样的话虽然删除时间长,但能删除掉数据,而且不会产生死锁或超时错误,也不用我们每次都手动提交删除任务。
  • 如果表中有几千万或几亿条数据需要删除,我们使用limit每次删除个几万条,然后再手动执行,恐怕数据没删完,人先疯了。
  • 以sql函数的形式写的循环删除功能如下:
DROP PROCEDURE IF EXISTS del;
CREATE PROCEDURE del(delCount int)
BEGIN
#  DECLARE delCount int DEFAULT 500000;
	 DECLARE RowCount int DEFAULT 0;
	 DECLARE Count int DEFAULT 0;
delwhile:WHILE delCount>RowCount DO
	DELETE FROM t_book WHERE create_date < '2005-6-1' limit 200000;
-- 	SELECT ROW_COUNT() INTO Count;          # 将上一次执行语句的受影响行数保存到 Count
-- 
--   IF Count < 200000 THEN LEAVE delwhile;  # 最后一次执行删除,删除完所有数据跳出循环
-- 	END IF;
	
	SET RowCount = RowCount + 200000;        # 此次执行共删除了多少条数据
	SELECT RowCount;
  SELECT SLEEP(5);
END WHILE;
SELECT RowCount;
END
#=========先执行上面的语句创建sql函数再执行下面的语句============
call del(1000000);  # 本次要删除多少数据

里面的参数可以根据需求改动,这个sql可以用于删除符合条件的所有数据但不能定量的删除我们规定的要删除的数据量,比如要删除七十万它可能删了八十万条数据,如果要实现定量删除数据,需要在sql中使用使用动态参数。

方式二:

将表中我们需要保留的数据复制出来到相同表结构的表中,再删除原表


在使用删除操作时要特别小心,一般删除大量的数据需要向领导报备同意,并且对数据进行备份

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐