社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

教你 88 秒插入 1000 万条数据到 MySQL 数据库表

数据分析与开发 • 6 年前 • 691 次点击  

(给数据分析与开发加星标,提升数据技能


来源:BraveLN

my.oschina.net/u/3632227/blog/2347849


我用到的数据库为,mysql数据库5.7版本的


  • 首先自己准备好数据库表


其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下:


com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4232009 > 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.


出现上面的错误是因为数据库表的 max_allowed_packet 这个配置没配置足够大,因为默认的为4M的,后来我调为100M就没报错了


set global max_allowed_packet = 100*1024*1024* 


记住,设置好后重新登录数据库才能看的设置后的值


show VARIABLES like '%max_allowed_packet%'


  • 代码如下:


package insert;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;

import com.mysql.jdbc.PreparedStatement;

public class InsertTest {

     public static void main(String[] args) throws ClassNotFoundException, SQLException {
         final String url = "jdbc:mysql://127.0.0.1/teacher" ; 
         final String  name = "com.mysql.jdbc.Driver" ; 
         final String user = "root" ; 
         final String password = "123456" ; 
         Connection conn = null ; 
         Class.forName(name); //指定连接类型 
         conn = DriverManager.getConnection(url, user, password); //获取连接 
         if (conn!= null ) {
             System.out.println( "获取连接成功" );
             insert(conn);
         } else {
             System.out.println( "获取连接失败" );
         }

     }
     public static void insert(Connection conn) {
         // 开始时间
         Long begin = new Date().getTime();
         // sql前缀
         String prefix = "INSERT INTO t_teacher (id,t_name,t_password,sex,description,pic_url,school_name,regist_date,remark) VALUES " ;
         try {
             // 保存sql后缀
             StringBuffer suffix = new StringBuffer();
             // 设置事务为非自动提交
             conn.setAutoCommit( false );
             // 比起st,pst会更好些
             PreparedStatement  pst = (PreparedStatement) conn.prepareStatement( "" ); //准备执行语句
             // 外层循环,总提交事务次数
             for ( int i = 1 ; i <= 100 ; i++) {
                 suffix = new StringBuffer();
                 // 第j次提交步长
                 for ( int j = 1 ; j <= 100000 ; j++) {
                     // 构建SQL后缀
                     suffix.append( "('" + uutil.UUIDUtil.getUUID()+ "','" +i*j+ "','123456'" + ",'男'" + ",'教师'" + ",'www.bbk.com'" + ",'XX大学'" + ",'" + "2016-08-12 14:43:26" + "','备注'" + ")," );
                 }
                 // 构建完整SQL
                 String sql = prefix + suffix.substring( 0 , suffix.length() - 1 );
                 // 添加执行SQL
                 pst.addBatch(sql);
                 // 执行操作
                 pst.executeBatch();
                 // 提交事务
                 conn.commit();
                 // 清空上一次添加的数据
                 suffix = new StringBuffer();
             }
             // 头等连接
             pst.close();
             conn.close();
         } catch (SQLException e) {
             e.printStackTrace();
         }
         // 结束时间
         Long end = new Date().getTime();
         // 耗时
         System.out.println( "1000万条数据插入花费时间 : " + (end - begin) / 1000 + " s" );
         System.out.println( "插入完成" );
     }
}



推荐阅读

(点击标题可跳转阅读)

从程序员的角度深入理解 MySQL

MySQL 安全问题

MySQL 之 SQL 优化实战记录


看完本文有收获?请转发分享给更多人

关注「数据分析与开发」加星标,提升数据技能


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/y6XDLP6anF
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26510
 
691 次点击