mysql - 请问有innodb 引擎的表导入900w 的数据,用了快9个小时。有什么快速的方法吗。正常是多少小时一般。
PHP中文网
PHP中文网 2017-04-17 15:35:07
0
3
528

1.导入备份的数据到表中,表是innodb引擎,900w多条,导入时用了将近9小时
2.下面是sh脚本代码片段

`$MYSQL -u$dbUser -h$dbHost -p$dbPassword --default-character-set=utf8 $dbName < $mysqlImportFile`

3.问题:
1)时间是否正常导了这么长时间
2)有没有更快速的方法
3)网上找的方法是先关闭事务

 SET autocommit=0;
 在脚本里应该如何写呢?    
PHP中文网
PHP中文网

认证高级PHP讲师

membalas semua(3)
洪涛

1、索引可以先去掉,导完了再加上。
2、把binlog关了。(减少写磁盘)
3、buffer_pool能调多大调多大。(减少写磁盘)
4、redo_log大小能多大多大(减少checkpoint)
5、flush neighbors打开(增加顺序写磁盘)
6、flush_at_trx_commit=0(减少写磁盘)
7、5.7可以直接像拷贝myisam表一样拷贝ibd,不知道会不会快(没过做比较)

刘奇

修改/etc/my.cnf配置
添加autocommit=0;
注释掉log-bin=mysql-bin(暂时不没有主从配置需求)
导入速度果然快了很多

注意导入后删除掉autocommit=0;不然修改表的操作会不能执行,必须手动提交才可以。

洪涛

开启事务批量导入,速度是很快的,我在Ubuntu(i5-3230M)上PHP平均每秒能插入超过5000条记录到5.6,也就是导入900万数据估计只需 9000000/5000/60 = 30分钟.
需要注意的是,MySQL InnoDB里,每个写操作比如INSERT/UPDATE/DELETE等都会被当做一个事务自动提交.
所以需要先SET AUTOCOMMIT=0禁掉自动提交后再START TRANSACTION开启事务,最后手动COMMIT提交.

另外,减少写日志操作也能加快写入性能:
禁用 log-bin 二进制日志.
禁用 general_log 审计日志.
innodb_flush_log_at_trx_commit 设为0,禁止每次提交事务都写入日志.
加大 innodb_buffer_pool_size.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan