您所在的位置:首页 > 新闻中心 > sql长度限制解决,mysql批量执行sql文件的方法_Mysql_脚本之家
公司要闻
sql长度限制解决,mysql批量执行sql文件的方法_Mysql_脚本之家
发布时间:2019-12-22 00:35
访问量:359

3、在mysql下执行source /batch文件所在目录/batch.sql;

最近尝试插入1百万条数据进db,以mysql为例。

最后发现原因是SQL语句长度大于1M,而我机器上的mysql是默认设置,

1、待执行的sql文件为1.sql、2.sql、3.sql、4.sql等

4. ibdata1无限增长的问题

每个Student对象大约是50字节,每insert1百万大约是50M。多insert几次后执行删除操作,发现ibdata1文件反而接近翻倍的增长。解决方法如下:

  • 关闭mysqld服务
  • 删除ibdata1、ib_logfile0/1、对应的database文件夹
  • my.ini的[mysqld]里添加 innodb_file_per_table=1 ,这样就会给每个表创建一个单独的ibd文件

最后是Demo的源码,如果你有更快的方法,不妨留言~

今天发现了一个错误:

以上就是小编为大家带来的mysql批量执行sql文件的方法全部内容了,希望大家多多支持脚本之家~

3. MultiThread insert

试了下在方法2(batch insert)的基础上,采用4个线程同时insert,1百万条数据耗时16s,反而慢了。估计时间都耗在创建connection、单表加锁上了。在这个场景下,MultiThread对解决问题无益。

 

2、写一个batch.sql文件:

2. batch insert

上面这种方式有2个问题:

  1. 在DB端,每次执行都会以1个单独的事务执行;
  2. 在网络上,传输的次数过多、每次传输的效率较差。

相应的解决方法是:

  1. 在执行前后套BeginTransaction/Commit,保证所有的insert都是在一个大事务里; // 光是这样,1万条只要不到2s,1百万条只要75s
  2. 每1万条数据,拼接成1个大sql,只要不超过 max_allowed_packet=1M 的默认限制即可。具体多少行拼成1条,视字段多少而定,拼成的sql如下。 // 这样的效果也很显著,1百万条只要13s

    insert into table (fields...) values (1...), (2...), ... , (10000...);
    
  3. 澳门新濠登录网址,可以修改mysql的默认设置,在my.ini里添加如下配置。但试下来效果并不明显,改成10M、每次拼接10万条数据,总时间仍为13s,可以想见这时瓶颈已经不是传输时间了,而是对表的操作。

    [mysqld]
    max_allowed_packet=10M // 1M default
    

Could not execute JDBC batch update

source 1.sql;source 2.sql;source 3.sql;source 4.sql;

1. 顺序insert

先写了个无脑的for循环作为base-line,插1万条耗时1m53s,根本不敢插1百万。

foreach(var student in students){
    var sql = string.Format("insert into student ... ");
    cmd.CommandText = sql;
    cmd.ExecuteNonQuery();
}

问题就解决了。

 

sql长度限制解决 今天发现了一个错误: Could not execute JDBC batch update 最后发现原因是SQL语句长度大于1M,而我机器上的mysql是默认设置,...

 

 

 

也就是说mysql通讯的数据包大小设置是1M,这就造成sql语句执行失败。

于是把mysql的配置文件(my.ini)中的max_allowed_packet = 6M变大,

 

mysql sql长度限制解决