关于mysql百万级数据的插入和删除

这几天有个朋友让我帮他优化mysql百万级操作db的事。于是我就答应了……。优化完个人做个笔记。给大家一个参考……如果有更好的方法,或建议可以联系[email protected]

程序员不想做解释直接上代码:

public boolean test(String filePath) throws Exception{
        String sql = "LOAD DATA INFILE ‘"+filePath+"‘ REPLACE INTO TABLE t_table FIELDS TERMINATED BY ‘\r\n‘ lines terminated by ‘\r\n‘ (terminal_id)";
        PreparedStatement  pstmt  =jdbcTemplate.getDataSource().getConnection().prepareStatement(sql);
        pstmt.execute();
        return false;
    }

表里面也只有一个字段,如果文件有要插入多个字段就要以文件中的分隔符来分隔,注意点 如不懂可以网上查查 LOAD DATA INFILE的用法…… (本文不是给伸手党准备的,见谅)

这个是springmvc上传文件上后台。然后后处理的controller类中的代码如果下

@RequestMapping(value = "/batchAdd", method = RequestMethod.POST)
    @ResponseBody
    public void batchAdd(@RequestParam(value="addBatchFile",required = false) MultipartFile uploadfile){

        String msg = "批量导入出错";
        try {
            long start = System.currentTimeMillis();
            System.out.println(start);
            String name="file"+System.currentTimeMillis()+".txt";
            File file = new File(name);
            uploadfile.transferTo(file);

            //此处要注意windows和linux的File.separator不一样…… 这里还要测一下的
            service.test(file.getAbsolutePath().replaceAll("\\\\", "//"));
            long end = System.currentTimeMillis();
            System.out.println(end);
            System.out.println("共花费" +(end-start));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    ........
    }

这个样插入mysql的500w之内大概3分钟之内能完成。

==================优美的分隔线==========================================

百万级的删除

        @RequestMapping(value = "/batchDelete", method = RequestMethod.POST)
    @ResponseBody
    public void batchDelete(@RequestParam(value="deleteBatchFile",required = false) MultipartFile uploadfile){

    List<String> list = new ArrayList<String>();
        try {

                CommonsMultipartFile cf= (CommonsMultipartFile)uploadfile;
                DiskFileItem fi = (DiskFileItem)cf.getFileItem(); 

                File f = fi.getStoreLocation();
                List<String> data =FileUtils.readLines(f);
                service.updateBatchDel("delete from t_table where terminal_id= ?",data);
                long end = System.currentTimeMillis();
                System.out.println(end);
                System.out.println(end-start);

                code = 0;
        }catch (Exception e){
        }
        return "xxxxxxxx";
    }

service 的代码如下

 public boolean updateBatchDel(String sql,List<String> data){
         boolean flag = false;
         PreparedStatement pstmt = null;
         Connection con = null;
         try {
             con = jdbcTemplate.getDataSource().getConnection();
                con.setAutoCommit(false);
                pstmt = con.prepareStatement(sql);
                for(int i =0 ;i<data.size();i++){
                    pstmt.setString(1,data.get(i).trim());
                    pstmt.addBatch();
                }
                System.out.println("------");
                pstmt.executeBatch(); //批量执行
                con.commit();//提交事务
                flag = true;
            } catch (SQLException e) {
                try {
                    con.rollback(); //进行事务回滚
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }finally {
                try {
                    pstmt.close();
                    con.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return flag;
    } 

这样删除百万级的数据也只在2分钟之内。

时间: 2024-07-31 12:40:11

关于mysql百万级数据的插入和删除的相关文章

mysql 百万级数据的模糊查询 优化 笔记

最近老大给了一个需求,是要写一个姓名的模糊查询. 问题很简单,难度在于这张表有将近500W条数据. 如果要做中文的模糊查询,效率简直惨不忍睹. 网上查了一下资料,发现全文索引挺符合我的需要的. 结果,使用下来.其实并不太符合我的要求. 全文索引的最小单位是词,如果不是在 in boolean mode 下是没办法 查询的 其次,全文索引只支持 半模糊查询,我所谓的半模糊就是  xx like 'xx%' 如果使用全模糊查询,建完索引之后,用 like 或者用 regexp 在常用关键词的时候 确

Java mysql 实现JDBC百万级数据插入

因为公司项目需要做一个excle快速导入到mysql功能,之前已经解决Java读取excle文件,但是因为文件有100w+的数据,插入mysql数据库很慢,1小时10w条,必须要做优化,后面写了批量插入1000条y一个批,但是速度还是很慢,查看数据库后发现mysql数据写入很慢,所以就对mysql数据做了写入优化,主要参考https://blog.csdn.net/qq_31065001/article/details/71519197 对一般情况下mysql上百万数据读取和插入更新是没什么问题

百万级数据插入的优化

插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 如果我们每插入一条都执行一个SQL语句,那么我们需要执行除了连接和关闭之外的所有步骤N次,这样是非常耗时的,优化的方式有一下几种: 在每个insert语句中写入多行,批量插入 将所有查询语句写入事务中 利用Load Data导入数据 每种方式执行的性能如下. Innodb引擎 InnoDB

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试

我想测试EF在一百万条数据下的显示时间!这分数据应该有很多同学想要,看看EF的性能! 服务器 现在来向SQL2008R2插入1000000条数据吧 declare @i int; set @i=0; while @i<1000000 begin INSERT INTO [AppDB].[dbo].[MIS_Article] ([Id] ,[ChannelId] ,[CategoryId] ,[Title] ,[ImgUrl] ,[BodyContent] ,[Sort] ,[Click] ,[C

SQL 百万级数据提高查询速度的方法

SQL 百万级数据提高查询速度的方法 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

百万级数据实现PDO入库

<?php //获取随机英文字符串 function getNickname($length){ $strs="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"; $name=substr(str_shuffle($strs),mt_rand(0,strlen($strs)-11),$length); return $name; } //设置超时时间 set_time_limit(3600); ini_set('memor

JDBC连接数据库(MySql)步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。

主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能. 把十一个功能都放在一起. 一.JDBC连接数据库(编辑)步骤(主要有六个步骤).  1.注册驱动: Class.formName("com.mysql.jdbc.Driver");  2.获取连接:(1) param1:  要连接数据库的url-----> String url="jdbc:mysql:/

mySQL教程 第5章 插入 更新与删除数据

第5章 插入 更新与删除数据 使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 为表中所有字段插入数据,可以不用指定列 其中的into可以省去 insert into TStudent values ('00008','白安','男','132302197604044565','19760404', '[email protected]','JAVA','20120803')

JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能

主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一个功能都放在一起. 安装下载的数据库驱动程序jar包,不同的数据库需要不同的驱动程序(这本该是第一步,但是由于属于安装类,所以我们放在最后) 一.JDBC连接数据库(编辑)步骤(主要有六个步骤).  1.注册驱动: Class.forName("com.mysql.jdbc.Driver"