Mysql提高导入速度
我们在利用source导入数据到mysql时,会由于数据量大(百M级)比较大,速度及其缓慢。要怎么处理这种问题呢?
一般sql文件导入数据库命令是:
mysql>use mysql_db;
mysql>source /tmp/mysqlfile.sql
根据Mysql官方建议,有几个措施可以提高导入速度:
1.对于MyISAM,调整系统参数:bulk_insert_buffer_size(至少单个文件大小的2倍以上)
2.对于InnoDB,调整系统参数:innodb_log_buffer_size(至少单个文件大小的2倍以上,导入完成后可以改回默认的8M,注意不是innodb_buffer_pool_size。)
3.除主键外,删除其他索引,导入完成后重建索引。
4.关闭自动提交:autocommit=0。(请勿用set global autocommit=1;命令来关闭,否则整个MySQL系统都会停止自动commit,innodb log buffer很快就会爆满,5和6项也请仅在会话中有效,正确做法请往下看)
5.关闭唯一索引检查:unique_checks=0。(关闭了这一项会影响onduplicate key update的效果)
6.关闭外键检查:foreign_key_checks=0。
7.insert值写在一条语句内,如:INSER TINTO yourtable VALUES(1,2),(5,5),...;
8.有自增列的,设置:innodb_autoinc_lock_mode的值为2,
其中,第1-2、8条在修改my.cnf文件,然后重启MySQL:
[mysqld]
bulk_insert_buffer_size=2G;
innodb_log_buffer_size=2G;
innodb_autoinc_lock_mode=2;
第3条用到的命令:
#删除索引
DROPINDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
# 添加索引ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
第4-6条写在.sql中,批量bash脚本如下:
for SQL in *.sql;
do
echo $SQL;
sed -i '1i\SET autocommit=0;\nSET unique_checks=0;\nSET foreign_key_checks=0;' $SQL
sed -i '$a\COMMIT;\nSET autocommit=1;\nSET unique_checks=1;\n SET foreign_key_checks=1;' $SQL
done