昨天需要导入数据,大概一个10M多点的sql文件,开始没导入过这么大的,用sqlyog和mysql的控制台导入都非常慢,大概3个小时了才50%,于是开始查怎么提速。
文章分三个部分,
1 影响速度的因素,
2 介绍如何操作,
3 一些关于my.ini的问题以及操作指令链接。
总结下来如下:
主要原因是mysql的数据保护机制,当前导入数据的方式比较安全,校验比较多,所以非常慢。
关于参数的介绍可以参考一下别人的解释说明:MYsql导入为什么这么慢
总结下来主要是这么几个参数的问题:
innodb_flush_log_at_trx_commit
mysql> set GLOBAL innodb_flush_log_at_trx_commit = 0;
1 默认值,最慢,每次事务提交都要写入log并刷新到磁盘上,这是最保险的方式
0 最快,每隔1S将log刷新到磁盘,但是不保证。事务提交不会触发log写入。很不安全,mysql挂了,那么上一秒的数据就都丢了。
2 折中的一种,事务提交会写入log,但是log刷新还是每秒一次,不保证。这种时候,就算mysql崩了,但是只要操作系统还在运转,数据还是会被写到磁盘上。
max_allowed_packet
net_buffer_length
mysql>show variables like 'max_allowed_packet';
mysql>show variables like 'net_buffer_length';
mysql -h127.0.0.1 -uroot -proot123 data_base_name --max_allowed_packet=16777216 --net_buffer_length=16384<your_sql_script.sql
sync_binlog = 0
mysql> set GLOBAL sync_binlog = 0;
0 不刷新 binlog,也就是 mysql 只管写数据,至于数据啥时候刷新,由操作系统负责。
1 每1次事务都要强制刷新,写入磁盘,可以看出,这是一种非常保险的方式,但是可想而知,性能会比较差,取决于存储介质的读写速度
N,每 N 次事务强制刷新一次磁盘。设的大一些,可以得到一定的性能提升,但是遇到系统崩溃,会丢失 N 个事务的数据。
另外一些可以设置的地方
innodb_autoextend_increment 表空间自增值
innodb_log_buffer_size log 缓存区大小
innodb_log_file_size binlog 文件大小
bulk_insert_buffer_size 批量写入的数据大小
这些变量全都可以在 mysql 官方的文档里面查到,不同的版本有不同的默认值,最新版本的 mysql,这些变量的默认值已经非常大了,都是几十 MB 级别的,一般不会成为性能瓶颈。
建议直接使用mysql导入,不用管理软件
1.打开控制台,输入密码进入msyql
C:\Users\QIANG ZHANG>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.16 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set GLOBAL innodb_flush_log_at_trx_commit = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> set GLOBAL sync_binlog = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> create database testdb;
Query OK, 1 row affected (0.04 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| |
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
6 rows in set (0.00 sec)
使用数据库
mysql> use testdb;
Database changed
导入数据
mysql> source F:\xxxxx.sql;
在查找一些攻略时,有人提到了别的参数,但是在更改时发现,提示这是一个只读变量,不能更改
mysql> set innodb_log_file_size = 1024M;
ERROR 1238 (HY000): Variable 'innodb_log_file_size' is a read only variable
这样的话只能在my.ini中进行修改
有写ini文件可能找不到,可以参考这个链接新建my.ini,注意提前备份好数据库
找不到my.ini文件怎么办
常见数据库操作指令
数据库指令