關於mysql百萬級數據的插入和刪除


這幾天有個朋友讓我幫他優化mysql百萬級操作db的事。於是我就答應了……。優化完個人做個筆記。給大家一個參考……如果有更好的方法,或建議可以聯系agnils@foxmail.com 

程序員不想做解釋直接上代碼:

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分鍾之內。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM