解决mysql导入数据文件过慢的问题

目前遇到一个问题,mysql 使用 source 命令导入  *.sql  数据文件时,运行的很慢,大概一秒钟插入一两百条左右的样子,对于大的文件来说这个太慢了。

1.登入mysql

$ mysql -uroot -p***

2.查看mysql中对于参数 innodb_flush_log_at_trx_commit 的配置

show global variables where variable_name = 'innodb_flush_log_at_trx_commit';

3.修改

SET GLOBAL innodb_flush_log_at_trx_commit = 0;

修改完成后在次执行相同的文件,200M大约200w+条的数据在1分钟左右。

对于该参数的不同值的说明:

1.innodb_flush_log_at_trx_commit参数为 0
        binlog_group_flush && thd_flush_log_at_trx_commit(NULL) == 0 条件成立,因此直接return了,那么这种情况下log_buffer_flush_to_disk函数不会调用,因此不会做redo刷盘。依赖master线程。
    2.innodb_flush_log_at_trx_commit参数为 1
        !binlog_group_flush || thd_flush_log_at_trx_commit(NULL) == 1 返回为1即为True,因此调用log_buffer_flush_to_disk(True),因此需要做redo刷盘,也要做sync。
    3.innodb_flush_log_at_trx_commit参数为 2
        !binlog_group_flush || thd_flush_log_at_trx_commit(NULL) == 1 返回为0即为Flase,因此调用log_buffer_flush_to_disk(Flase),因此需要做redo刷盘,不做sync。依赖OS的刷盘机制。

参考例子如下:

mysql -u root -p -h 127.0.0.1
 
 
mysql> use test;
Database changed
 
mysql> set global innodb_flush_log_at_trx_commit=0;
Query OK, 0 rows affected (0.03 sec)

mysql> set global sync_binlog=0;
Query OK, 0 rows affected (0.03 sec)
 
mysql> set global max_allowed_packet=1024*1024*512;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global bulk_insert_buffer_size=512*1024*1024;
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global innodb_buffer_pool_size=512*1024*1024;
Query OK, 0 rows affected, 1 warning (0.09 sec)
 
mysql> source /root/test.sql

实际测试结果感觉还是不够快。

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注