精华内容
下载资源
问答
  • mysql批量删除数据
    千次阅读
    2021-01-19 07:20:40

    1.like与 in批量删除指定记录

    like语法

    like主要是用来模糊查询了

    sql = "delete from A where field like '%ABC%'" 这个可用于字符与数字

    in 语法

    sql = "delete from A where field id(1,2,3)"  这个只能用在数字

    关联删除

    delete B from B

    where exists (select 1 from A where B.accountid=A.accountid);

    上面两条方法如果删除100W级别的数据库估计是没什么问题,如果是1000W估计就不行了

    假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1

    会发现删除失败,因为lock wait timeout exceed的错误。

    因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成

    代码如下

    DELETE FROM syslogs WHERE status=1 ORDER BY statusid LIMIT 10000;

    然后分多次执行就可以把这些记录成功删除。

    另一种 删除方向。

    上面通过比较觉的需要删除的量不是太大时,把需要删除的PID生到到另一个临时表中。

    代码如下

    mysql DBname -e "select a.pid from table1 a ,table2 b where a.pid=b.pid">del_pid.txt;

    sed -i '1d' del_pid.txt

    awk '{print "delete from table1 where pid=",$1,";"}' del_pid.txt >del_pid.sql

    mysql DBname

    这样把SQL拆成多个SQL执行速度应该不会太慢了。

    更多相关内容
  • 主要介绍了mysql批量删除大量数据的相关资料,需要的朋友可以参考下
  • 原本前台使用的就是一条一条删除数据,当多选时调用删除方法并不能成功,查看发现SQL批量删除语句和单个删除语句不太一样,于是记录一下学习过程。 一、一次删除一条数据 SQL语句如下: DELETE FROM 表名 WHERE ...

    前言

    原本前台使用的就是一条一条删除数据,当多选时调用删除方法并不能成功,查看发现SQL批量删除语句和单个删除语句不太一样,于是记录一下学习过程。


    一、一次删除一条数据

    SQL语句如下:

    DELETE FROM 表名 WHERE 属性名 =?
    //例如:DELETE FROM `sp_goods` WHERE (`goods_id`='927')

     应用到express中去删除数据库中的数据,根据ID删除单条数据。

    代码如下(示例):

    //根据传过来的id删除数据库中的数据
    var dbConfig = require('../util/dbconfig');
    let delUser=async(req,res)=>{
        let { id } = req.body;
        console.log(id)
    	let sql = `DELETE FROM user WHERE id=?`;
        let sqlArr = [id];
        dbConfig.sqlConnect(sql,sqlArr,(err,result)=>{
            if(err) throw err; //打印错误信息
            if(result.affectedRows){//执行成功
                res.send({
                    code:200,
                    status: true,
                    msg: "del success!",
                });
            }else{
                res.send({
                    code:400,
                    status: false,
                    msg: "fail!"
                });
            }
        })
    	
    }
    //将接口暴露出去
    module.exports = {delUser};

    二、一次同时删除多条数据

    SQL语句如下:

    delete from 表名 where 属性名 in (?) 
    //例如删除user表中ID为1,3,5的数据
    delete from user where id in (1,3,5) 

    此时前台传过来的ID不再是单个,而是这种如1,2,3用多个用逗号隔开的格式,书写接口方法删除数据库数据。

    代码如下(示例):

    //根据传过来的id(如1,2)删除数据库中的数据
    //传过来的id是 1,2,4这种逗号分隔的格式
    var dbConfig = require('../util/dbconfig');
    let delUser=async(req,res)=>{
        let { id } = req.body;
        console.log(id)
        // 删除1~n条
    	let sql = `DELETE FROM user WHERE id in (${req.body.id})`;
        let sqlArr = [];
        dbConfig.sqlConnect(sql,sqlArr,(err,result)=>{
            if(err){//执行失败
                res.send({
                    code: 400,
                    msg: '删除失败',
                    data: err
                })
            }else {
                res.send({
                    code: 200,
                    msg: '删除成功',
                    data:result
                })
            }
        })
    	
    }
    //将接口暴露出去
    module.exports = {delUser};

    总结

    以上就是这次记录的内容,删除一条或者多条数据的方法大同小异,需要的根据自己项目选择,如果前端涉及多选删除的话可选用第二种删除多条数据的方法,只要处理好传过来的ID就行啦。

    🆗,就到这啦!

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

    千次阅读 2018-09-29 13:06:37
    方法描述: 批量删除工作经历 * @param record * @返回类型: list * @创建人: ZhiXin fan * @创建时间: 2018年9月29日 */ int piLiang(List list); Service层 /** * 方法名称:piLiang * 方法描述:...



    update renyuan_gongzuojinglibiao

    shanChuBiaoZhi = 0,


    when id=#{item.id} then #{item.shanChuShiJian}



    where id in

    #{item.id}


    -------------------------------------------------------------------------
    Dao层
    /**
    *

    方法名称:piLiangShanChuGongZuoJingLi


    *

    方法描述: 批量删除工作经历


    * @param record
    * @返回类型: list
    * @创建人: ZhiXin fan
    * @创建时间: 2018年9月29日
    */
    int piLiang(List list);

    Service层
    /**
    *

    方法名称:piLiang


    *

    方法描述: 批量删除工作经历


    * @param record
    * @返回类型: list
    * @创建人: ZhiXin fan
    * @创建时间: 2018年9月29日
    /
    int piLiang(String record);
    -----------------------------------------------------
    Impl实现层
    /
    *
    *

    方法名称: piLiang


    *

    方法描述: 批量


    * @param record
    * @返回类型: list
    * @创建人: ZhiXin fan
    * @创建时间: 2018年9月29日
    /
    @Override
    public int piLiang(String record) {
    // TODO Auto-generated method stub
    List list = JSON.parseArray(record, GongZuoJingLiBiao.class);
    for(GongZuoJingLiBiao k : list) {
    k.setShanChuShiJian(new Date());
    }
    return gongzuojinglibiaomapper.piLiang(list);
    }
    --------------------------------------------------------------
    控制层
    /
    *
    *

    方法名称: piLiang


    *

    方法描述:批量删除工作经历


    * @param record
    * @返回类型: Response
    * @创建人: ZhiXin fan
    * @创建时间: 2018年9月29日
    */
    @ResponseBody
    @RequestMapping(value="/piLiang" ,method=RequestMethod.POST)
    public Response piLiang(String record) {
    int i =gongZuoJingLiService.piLiang(record);
    if(i>0) {
    return new Response(AppConstant.zhuangTaiZhi.CHENGGONG,“成功”,"");
    }else {
    return new Response(AppConstant.zhuangTaiZhi.CHENGGONG,“失败”,"");
    }
    }
    展开全文
  • Mysql批量删除大量数据

    千次阅读 2022-08-26 22:56:01
    假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock wait timeout exceed...

    一、Mysql批量删除大量数据

    方案1

    假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock wait timeout exceed的错误。

    因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成:

    DELETE FROM syslogs WHERE status=1 ORDER BY statusid LIMIT 10000;
    

    如果要用order by 必须要和 limit 联用,否则被优化掉。然后分多次执行就可以把这些记录成功删除。

    注意:
    执行大批量删除的时候注意要使用上limit。因为如果不用limit,删除大量数据很有可能造成死锁。
    如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库。
    平时update和delete的时候最好也加上limit 1 来防止误操作。

    方案2

    1.删除大表的部分数据
    一个表有1亿6000万的数据,有一个自增ID。最大值就是1亿6000万,需要删除大于250万以后的数据,有什么办法可以快速删除?

    看到mysql文档有一种解决方案:http://dev.mysql.com/doc/refman/5.0/en/delete.html

    If you are deleting many rows from a large table, you may exceed the lock table size for an InnoDB table. To avoid this problem, or simply to minimize the time that the table remains locked, the following strategy (which does not use DELETE at all) might be helpful:

        Select the rows not to be deleted into an empty table that has the same structure as the original table:
        INSERT INTO t_copy SELECT * FROM t WHERE ... ;
    
        Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
        RENAME TABLE t TO t_old, t_copy TO t;
    
        Drop the original table:
        DROP TABLE t_old;
    

    删除大表的多行数据时,会超出innod block table size的限制,最小化的减少锁表的时间的方案是:
    1、选择不需要删除的数据,并把它们存在一张相同结构的空表里
    2、重命名原始表,并给新表命名为原始表的原始表名
    3、删掉原始表

    方案3

    在My SQL数据库使用中,有的表存储数据量比较大,达到每天三百万条记录左右,此表中建立了三个索引,这些索引都是必须的,其他程序要使用。由于要求此表中的数据只保留当天的数据,所以每当在凌晨的某一时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据,使用delete删除表中的上百万条记录时,MySQL删除速度非常缓慢,每一万条记录需要大概4分钟左右,这样删除所有无用数据要达到八个小时以上,这是难以接受的。

    查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的,于是删除掉其中的两个索引后测试,发现此时删除速度相当快,一百万条记录在一分钟多一些,可是这两个索引其他模块在每天一次的数据整理中还要使用,于是想到了一个折中的办法:

    在删除数据之前删除这两个索引,此时需要三分钟多一些,然后删除其中无用数据,此过程需要不到两分钟,删除完成后重新创建索引,因为此时数据库中的数据相对较少,约三四十万条记录(此表中的数据每小时会增加约十万条),创建索引也非常快,约十分钟左右。这样整个删除过程只需要约15分钟。对比之前的八个小时,大大节省了时间。

    二、delete和truncate区别

    1、delete删除数据的原理:(delete属于DML语句)

    表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!
    这种删除表的优点是:支持回滚,后悔了可以恢复数据,可以删除单条数据
    缺点:删除效率比较低

    delete from user;  //删除user表中的数据,但是这种删除数据的方式有点慢。
    

    2、truncate删除数据的原理:(DDL)

    效率比较高,表被一次截断,物理删除
    优点:快速,不走事务,不会锁表,也不会产生大量日志写入日志文件
    缺点:不支持回滚,只能删除表中所有数据,不能删单条数据
    如果说公司项目里面有一张大表,数据非常多,几亿条记录:
    删除的时候,使用delete,也许执行一个小时才能删除完,效率极其低;
    可以选择使用truncate删除表中的数据。只需要不到1s的时间就能删除结束,效率较高。
    但是使用truncate之前,必须仔细询问客户是否真的需要删除,并警告删除之后不可恢复!!!

    truncate table user; //删除user表中的数据,快速。
    

    3、删除表操作:

    drop table 表名;// 删除表,不是删除表中的数据
    

    truncate和delete是删除表中的数据,表还在。

    参考文章
    mysql批量删除大量数据
    MySQL中快速删除表中的数据
    Mysql 大批量删除数据(解决方案)
    MySQL删除大批量数据

    展开全文
  • 笔者最近工作中遇见一个性能瓶颈问题,MySQL表,每天大概新增776万条记录,存储周期为7天,超过7天的数据需要在新增记录前老化。连续运行9天以后,删除一天的数据大概需要3个半小时(环境:128G, 32核,4T硬盘),而...
  • 有时候我们在安装一些cms的时候,这些cms都是带表前缀的方便区分数据,但有时候我们测试完需要删除的时候又有别的前缀表就可以参考下面的方法
  • MySQL批量删除数据

    万次阅读 2019-01-17 22:05:21
    我们在项目中会遇到这样的问题,有一些数据库表是不需要的,这时候就涉及到删除表操作,一张一张删除肯定会不耐烦,尤其是在二次开发中,这时候就要考虑批量删除了 这里拿最近做的项目举个例子: 我需要删除数据库...
  • mysql批量删除

    2021-10-13 09:20:13
    mysql批量删除表 查询构建所有的删除语句 SELECT CONCAT('drop table ',table_name,';') FROM information_schema.TABLES WHERE table_name LIKE 'fine_%'; 复制查出来的删除sql语句,并批量执行 drop table ...
  • 尝试每次只删除一天的数据,还是卡顿的厉害,没办法,写个Python脚本批量删除吧。 具体思路是: 每次只删除一天的数据; 删除一天的数据,每次删除50000条; 一天的数据删除完,开始删除下一天的数据; Python...
  • MySQL批量删除数据脚本

    千次阅读 2018-04-14 18:12:19
    #!/usr/bin/python # -*- coding: UTF-8 -*- import os import MySQLdb import time db=MySQLdb.connect(host="172.16.32.11",user="a",passwd="root1123",port=3307,... print "已经完成批量删除。。。。。"  
  • java技术--mysql批量删除大量数据

    千次阅读 2019-09-18 16:04:45
    1.假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条 2.直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,...4.我们可以利用 MySQL这...
  • 问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中...答案为个人原创假设表的引擎是 Innodb, MySQL 5.7+删除一条记录,首先锁住这条记录,数据...
  • MySQL数据批量删除语句

    千次阅读 2020-10-24 20:10:11
    MySQL数据库批量删除语句 格式: 例如: 所以,语句格式为: delete from 表名 where 条件(一般是id) in (你要删除的行数,用逗号隔开)
  • 因为不能用Truncate(因为只是删除其中少部分数据),...MySQL删除速度非常缓慢每一万条记录需要大概4分钟左右,这样删除所有无用数据要达到八个小时以上,这是难以接受的。。网上搜到此文(http://blog.csdn.net/gao...
  • mysql批量删除多个表的方法

    千次阅读 2021-04-20 01:54:23
    mysql批量删除多个表的方法发布时间:2020-10-09 15:45:31来源:亿速云阅读:107作者:小新小编给大家分享一下mysql批量删除多个表的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家...
  • 批量删除MySQL数据库相同前缀的数据表工具可以批量删除MySQL数据库相同前缀的数据表。
  • 一个mysql数据库中,是可以同时安装几个网站程序的,在使用中,我们只需要用不同的数据库表前缀来区分就可以了。但随着我们不断调试,那么数据 库中的表,...详细操作:一、使用phpmyadmin工具批量删除mysql数据库表...
  • mysql批量删除大量数据的方法

    万次阅读 2021-01-27 01:21:16
    mysql批量删除大量数据假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock...
  • mysql批量删除数据

    千次阅读 2019-06-11 18:12:49
    删除要求: 删除数据库test中以'test_'开头的表,并排除test_a,test_b,test_c SELECT CONCAT('DROP TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' and TABLE_NAME like '...
  • 给上一篇文章配套个脚本方便大家实现删除大量数据。 废话不多说,直接上脚本: #!/bin/bash mx1=`ps aux | grep "deletedata.sh" | grep -v "grep" | wc -l` ps aux |grep "deletedata.sh" |grep -v "grep" echo $...
  • Mysql 大批量删除数据(解决方案)

    万次阅读 2020-10-20 19:53:18
    Mysql 大批量删除数据 参考微信公众号《Java自学之路》 在业务场景要求高的数据库中,对于单条删除或者更新的操作,在delete和update后面加上limit1是个好习惯。我在工作中看到有同事这样写,如果想要了解具体细节...
  • 例如:video表 views字段中,只保留数字,删掉多余英文字符 update videoset views=replace(views," views","") where id BETWEEN 946573AND 9476051;
  • 批量删除数据库记录

    2021-02-10 13:53:42
    有条件的分步删除数据表中的记录--创建测试表create table test as select * from dba_objects;Table created.--创建删除表的存储过程create or replace procedure deleteTab--插入语句SQL> insert into test ...
  • 批量删除MySQL数据库相同前缀的数据表工具可以批量删除MySQL数据库相同前缀的数据表。  
  • Mysql快速删除大量数据

    千次阅读 2021-05-23 10:55:11
    亿级数据量 方案1、 直接使用delete 因delete执行速度与索引量成正比,若表中索引量较多,使用delete会耗费数小时甚至数天的时间 方案2、 (1)创建临时表,表结构与原表结构相同 (2)将需要保留的数据插入...
  • MySQL批量插入数据

    千次阅读 2021-11-19 16:41:06
    1. 往表中插入50万条数据 步骤一:建表 create table dept( id int(11) not null auto_increment, deptName varchar(30) default NULL, address varchar(40) default NULL, ceo int NULL, primary key(id) )...
  • MySQL批量数据

    千次阅读 2022-04-27 15:56:22
    利用存储过程批量数据 -- 创建存储过程 DELIMITER ; CREATE PROCEDURE test_insert8 () BEGIN DECLARE i INT DEFAULT 1; -- 通过i控制造多少条数据 WHILE i<100 DO -- 替换为自己的insert语句 保留REPLACE...
  • php批量删除数据

    2020-12-17 16:29:42
    批量删除文章这个技术没什么高深莫测的,只是想写下来与大家分享。(适合初学者:) 1、首先在文章列表页面(list.php),将多选筐命名为:“$del_id[]”,值为文章ID号。 例如(list.php): <form name=”del_form”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,476
精华内容 32,590
关键字:

mysql批量删除数据

mysql 订阅
友情链接: ug230.rar