精华内容
下载资源
问答
  • 项目情况是这样的,数据库中有一张计费表,这张表是随着时间无限增长的,数据会越来越多,count一下数据共有8千万,而现在需要删除2019年之前所有的数据,大概7千多万条。表中有索引。 我直接使用 DELETE FROM ...

       项目情况是这样的,数据库中有一张计费表,这张表是随着时间无限增长的,数据会越来越多,count一下数据共有8千万条,而现在需要删除2019年之前所有的数据,大概7千多万条。表中有索引。

    我直接使用

    DELETE FROM table_name WHERE recordtime < "2019 01-01 00:00:00"

      这相当于愚蠢,因为直到连接断开,操作结果都没有返回,我估计是需要很多时间,但是愚蠢的我并不知道这个时间会大好几天这么长(我算了一下),当时删除两条数据花了0.05s,那删除7千万条需要多少小时呢将近500小时,这种估算的时间还算少的。因为删除数据的时候还要更新索引。时间会更多。

     delete语句删除数据的过程是一条一条删除的,并且同时将该行的删除操作作为十五记录在日志中保存以便进行回滚操作

    这边我需要介绍另一种方案:

    我需要删除2019年之前的数据,也就是需要保留以下部分数据的,

    方案如下 :

    1、创建新表backup和老表oldtable一样的表结果,具体操作: CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2;//筛选条件是选不出数据的

    2、提取旧表中你需要的数据并插入新表, 具体操作:INSERT INTO 新表 SELECT * FROM 旧表 WHERE 查询条件

    3、禁用外键为初始化旧表做准备SET foreign_key_checks = 0;(如果旧表中有外键,最好禁用下,否则truncate会提示,)

    4、清空旧表中所有的数据: TRUNCATE TABLE 旧表;

    5、将新表中数据全部在导入旧表

    6、开启外键 set foreign_key_checks = 1;

     

    上面的方案执行起来大概需要十分钟。

     TRANCATE操作:一次性从表中删除所有数据并不把单独的删除记录记入日志保存,删除的记录不可恢复。

    当表被truncate后,这个表和索引所占用的空间会恢复到初始大小,而delete操作不会减少表或索引所占用的空间

     

    这边介绍一下delete,drop和truncate的使用场景

    速度:drop>truncate>delete

    如果想删除表,drop

    如果想保留表而将所有数据删除,如果和事务无关,用truncate

    如果和事务有关,或者想触发trigger,用delete。当然删除部分数据用delete

     

    展开全文
  • 毫秒级删除MySQL数据库百万条数据

    千次阅读 2018-11-26 09:58:31
    最近遇到了清理历史数据的需求,需要去清楚数据库中的数据,但是DBA对数据库的删除任务做了各种限制,比如个事务的连接不能超过60s,不加事务的操作不能超过120s。也就是说大概百万级的数据需要在60s内全部删除。 ...

    最近遇到了清理历史数据的需求,需要去清楚数据库中的数据,但是DBA对数据库的删除任务做了各种限制,比如一个事务的连接不能超过60s,不加事务的操作不能超过120s。也就是说大概百万级的数据需要在60s内全部删除。

    原本是想先将符合条件所有记录全部查出来,再去做分批删除,没想到查询语句就超时了

    // 查询在update日期之前的所有记录
    List<Result> results = resultRepository.findByUpdateBefore(updDate);
    // 按照500条分组
    List<List<Result>> partition = Lists.partition(results, 500);
    // 分组删除
    for (List<Result> resultList : partition){
         resultRepository.deleteInBatch(resultList);
    }

     

    虽然在upDate上有索引,但是数据量还是太大了,在60s之内没有查出数据。

    只能分页查询,再循环删除了,这次在500ms之内就删除了,但是这个while循环总感觉写的不好,不知道有没有其他的办法。

    while (true){
       try{
           Pageable pageable = PageRequest.of(0,500);
           List<Result> results = resultRepository.findByUpdDateBefore(updDate,pageable);
           if (CollectionUtils.isNotEmpty(results)){
              resultRepository.deleteInBatch(results);
           }else{
              return;
           }
       }catch (Exception e){
           log.info("删除result失败:{}",e.getMessage());
           throw e;
       }
    }

     

     

     

    展开全文
  • 大型DELETE(删除大量数据)的种解决方案

    大型DELETE(删除大量数据)的一种解决方案

    参考文章:

    (1)大型DELETE(删除大量数据)的一种解决方案

    (2)https://www.cnblogs.com/laixiancai/p/4606608.html


    备忘一下。


    展开全文
  • 我这里的方案是用存储过程:首先对有重复的name分组及查询出来,然后循环删除重复数据,相同的name只保留最大id的那一条。 下面直接上存储过程: BEGIN DECLARE v_name INT(32); DECLARE v_maxid INT(10...

    看了网上方案,很多用到了关键字in,in适合类别少用的才效率高呀,而对于百万数据很多相同的话,直接导致索引失效,那就失去了这个关键字的意义了。

    我这里的方案是用存储过程:首先对有重复的name分组及查询出来,然后循环删除重复数据,相同的name只保留最大id的那一条。

    下面直接上存储过程:

    BEGIN
    	DECLARE v_name INT(32);
    	DECLARE v_maxid INT(10);
    	DECLARE _done INT(1) DEFAULT 0;
    	# 查询出所有重复数据
    	DECLARE _cur CURSOR FOR
    		SELECT t1.name, MAX(t1.id) maxid
    		FROM duplicated_user t1,
    			(
    				SELECT `name` FROM duplicated_user
    				GROUP BY `name`
    				HAVING COUNT(name) > 1
    			) t2
    		WHERE t1.name = t2.name
    		GROUP BY `name`;
    	# 错误定义,标记循环结束
    	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;
    	
    	OPEN _cur;
    		FETCH _cur INTO v_name, v_maxid;
    		# 循环删除重复数据
    		WHILE ( _done <> 1) DO
    			# 相同的name只保留最大id的那一条
    			DELETE FROM duplicated_user WHERE id < v_maxid AND name = v_name;
    			FETCH _cur INTO v_name, v_maxid;
    		END WHILE;
    	CLOSE _cur;
    END
    

    在这里插入图片描述

    这是duplicated_user表的结构,我这里是测试,所以就两个字段哈。

    那怎么很快的制造百万数据出来呢,请戳这篇博文:MySQL使用存储过程30秒插入百万数据!!!

    好了,有了百万数据后,我们执行存储过程可能发生以下报错:

    Out of range value for column
    

    解决办法:

    修改my.ini,将

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    修改为

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    然后执行大功告成

    直接只有一条最大id的数据,其他相同的全部删除了

    在这里插入图片描述

    我看了下不到30秒,就删除了160多万数据,这里我对name还没用索引,用了索引的话快到你没话说。。。

    好了,这样就解决了问题了,不知道大家有没有其他的方案,欢迎一起探讨哈。

    展开全文
  • Mysql百万数据的批量删除

    千次阅读 2019-05-14 18:00:17
    假设有个表(syslogs)有1000万条记录,需要在业务不 停止的情况下删除其中statusid=1的所有记录,差不多 有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock wait timeout ...
  • MYSQL 删除百万级数据

    千次阅读 2020-06-07 15:17:05
    MYSQL 刚建立的数据库的时候,没有考虑数据过多会导致后续查询的问题,也没有建立定期删除的存储过程,等到发现...如果数据库的数据在百万级以内,这一条顶多只是慢一点,但是对待千万级别的数据库,即使你已经把日期
  • 1.像mysql这个关系型数据库在数据量达到千万级别之后,删除数据尤其之慢,更甚者生成环境是基本不允许这样低效率的操作出现,为此需要另种优化删除方式–来经过该进,使用inner join 的方式删除起来,效率成倍的提升!...
  • 场景描述 线上mysql数据库里面有张表保存有每天的统计结果,每天有1千多万条,这是我们意想不到的... 删除一天的数据,每次删除50000天的数据删除完,开始删除天的数据; Python代码 # -*-coding:utf-8 -
  • 实现思路如下: ...至此就可以实现一百万条记录的插入了(我的电脑耗时327s?好像很慢!?) 之后再套一层循环就可以继续完成1千万记录的插入了。 下面给出可能用到的步骤(如未说明,代码默认为控制
  • 向Mysql批量插入50万条数据

    千次阅读 2019-11-03 22:40:54
    》批量插入数据脚本 表Sql: CREATE TABLE dept( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT '', loc VARCHAR(13) NOT...
  • Mybatis+Oracle插入万条数据

    千次阅读 热门讨论 2019-09-18 23:04:11
    最近工作中使用到批量删除,试了试网上的几种方法,下面三种方法都是插入2万条数据 使用oracle的insert all 特别注意:mysql默认接受sql的大小是1048576(1M),若数据量超过1M会报如异常错误者可以,进行分开处理,...
  • InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描遍整个表来计算有多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是,当count(*)语句包含 where条件时,两种...
  • 接昨天,继续用其他方法导入上百万条数据到MySQL。 下面是第三种方法????:用存储过程导入。
  • 公司的用户被人恶意注册了,user_id是连续着的,这些用户现在要清理掉,但是数据量太大,如何快速生成200w的delete语句呢? ps:生产环境不建议delete from user where user_id>a and user_id
  • oracle有个数据表现在已经有2500万条数据了,软件用到这个表的数据时就变的特别慢,所以准备把个月以前的数据全部清除。 我的步骤是(下边操作都是在plsql中运行的) 1、首先 将这个月的数据导出到个临时表中...
  • 批量插入1000w条数据

    千次阅读 2018-11-26 19:59:28
    1.创建部门表 CREATE TABLE dept ( id int UNSIGNED PRIMARY ... #执行过程,往emp表添加50万条数据 CALL insert_emp(100001,500000);  推荐每次添加50w条数据,循环添加20次,就是1000w条数据哦!!!
  • Sqlite基本操作,历史记录大于10自动删除 String sql = "delete from user where" + " (select count(id) from user )> 9 and " + " id in (select id from user order by id desc limit " + " (select count...
  • 本文介绍了在网上地震数据的实现代码,并借助于 Python 和 ElasticSearch,分析了全球和中国的地震分布,对中国多个省区的历史地震数据做了对比分析。所有源码和示例数据已上传至GitHub,有兴趣的读者可以下载源码后...
  • MySQL单表查询,经过排序 第一条数据

    千次阅读 2019-10-29 02:08:44
    select t.* from follow_details t ORDER BY t.add_time asc LIMIT 1;
  • 如果你要说:业务数据也需要那么我告诉你,业务数据肯定用的是本方案中的场景2中的分场景2模式(只有这一条路),但是业务数据会暴发到你连本方案都无法覆盖的那天的(很快的,如我上一家公司:几千万的会员生成...
  • ourmysql博客中提供了 《大表删除数据的思路》,对于大表依据主键删除的思路是必须的,删除几千万的数据还算是比较简单的,如果你的数据库中的表高达数亿记录 ,删除其中的几十亿,就需要考虑可用性的问题了。...
  • 5、事务(N提交次) 多线程插入(单表) 问:为何对同个表的插入多线程会比单线程快?同一时间对个表的写操作不应该是独占的吗? 答:在数据里做插入操作的时候,整体时间的分配是这样的: 1、多链接耗时 (30%...
  • 有这么个需求: 现在有个订单表里面有306条数据,需要删除2011-07-01日所有的数据,大约2000左右。应该如何操作。 有如下需要注意的地方: 1. 这个表没有进行分区 2. 为oracle数据库 3. 直接用...
  • oracle数据表有过万条数据后,删除数据就变的特别慢,有时甚至会卡死,所以在此分享个小白操作,望对各位有帮助。 删除前: 从原表创建新表,即:先把需要的某些数据导入到新表里,或者不加条件即要删除原表的...
  • EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化个EJB实例 5个目标文件...
  • Oracle数据库delete删除普通堆表千万历史记录。 直接删除的影响: 1.可能由于undo表空间不足从而导致最终删除失败的问题; 2.可能导致undo表空间过度使用,影响到其他用户正常操作。 改进方案:每删除1k行就...
  • oracle数据库高效插入千万条数据

    万次阅读 2018-08-06 17:19:25
    向ACCOUNTING_VOUCHER 表中插入千万条数据  思路:   1.新建一张和ACCOUNTING_VOUCHER数据库表结构一致的临时表,ACCOUNTING_VOUCHER_TEMP  2.向临时表ACCOUNTING_VOUCHER_TEMP中插入10条数据  3.使用...
  • 示例: 向user表中插入千万数据,...status二百万数据为1,八百万数据为0。 -- 如果该名字存储过程已存在,则删除 DROP PROCEDURE IF EXISTS proc_initData1; -- 创建 CREATE PROCEDURE proc_initData1 ( ) BEGI...
  • SQL高效分页(百万条数据

    千次阅读 2018-04-15 15:44:04
    种方法:效率最高 SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) as A WHERE RowNumber &gt; 页大小*(页数-1) --注解:首先利用Row_num...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,738
精华内容 18,295
关键字:

删除一百万条数据