怎么提高 MySQL 执行 sql 导入的速度

1、如果mysql的data数据很少,内存足够大,可以把data防止到内存盘中。

linux如下设置内存盘:

mount -t ramfs none /ram

默认使用内存一半

如果内存不够大,系统有多个硬盘,则把mysql应用程序和data目录分开到不同硬盘上。

2、mysql的表设置为myiasm,比同等条件下的innodb能快20倍以上

3、导入完成以后才创建数据库索引

4、导入完成以后根据需要转换为其他engine,比如innodb

5、多条数据插入一个表,可以使用多记录方式:

insert into tablename values('xxx','xxx'),('yyy','yyy')…;

6、如果多个mysql执行导入,可以使用delayed

insert delayed into tablename values('sss','ssss');

7、大文件sql文件可以用split分成多份再导

8、同等条件下,redhat比ubuntu强很多(几乎肯定)

9 性能调整技巧(Performance tuning tips)

1. 如果 Unix top 或 Windows 任务管理器(Task Manager) 显示服务的 CPU 占用率小于 70%,(shows that the CPU usage percentage with your workload is less than 70 %,)你的系统瓶颈可能在磁盘读写上。或许你提交了大量的事务,或者是缓冲池(buffer pool)太小了。将缓冲池设大点会有所帮助,但一定要注意不能大于物理内存的 80%。

2. 在一个事务中包含几个修改。如果事务对数据库进行了修改,那么在这个事务提交时 InnoDB 必须刷新日志到磁盘上。因为硬盘的旋转速度通常至多为 167 转/秒,那么只要磁盘不欺骗操作系统,提交的事务数目限止也同样为 167 次/秒·用户。

3. 如果掉失最近的几个事务无所谓的话,可以在 my.cnf 文件中将参数 innodb_flush_log_at_trx_commit 设置为 0。InnoDB 无论如何总是尝试一秒刷新(flush)一次日志,尽管刷新并不能得到保证。

4. 将日志文件(log files)设大一点,使日志文件的总和正好与缓冲池(buffer pool)一样大。当 InnoDB 用光日志文件的空间时,它不得不在一个时间点上将缓冲池内修改过的内容写到磁盘上。 小的日志文件可能引起不必要的磁盘写操作。但是大的日志文件的缺点就是在数据恢复时将占用较长的时间。

5. 同样 log buffer 尽量设大点,比如说 8 MB。

6. 如果要存储变长的字符串或字段可能会包含大量的 NULLs,请使用 VARCHAR 型字段代替 CHAR 。一个 CHAR(n) 字段总是使用 n bytes 来存储数据,即使这个字符串很短或是一个 NULL 值。较小的表更加适合缓冲池同时能够减少磁盘 I/O 。

7. (适合从 3.23.41 以上版本) 在某些版本的 Linux 和 Unixes 中,使用 Unix fsync 或其它类似的方法将文件刷新到磁盘是异常地慢的。InnoDB 默认的方法就是 fsync 。如果你对数据库系统的磁盘写性能不能感到满意,你可以尝试在 my.cnf 中将 innodb_flush_method 设置为 O_DSYNC,尽管 O_DSYNC 选项在多数的系统上看起来比较慢。

8. 在向 InnoDB 导入数据时,请确认 MySQL 没有打开 autocommit=1 。否则每个插入语句都要将 log 刷新到磁盘。在你的 SQL 导入文件的第一行加入

set autocommit=0;

并在最后一行加入

commit;

如果使用 mysqldump 选项 –opt,你将会得到一个快速导入 InnoDB 表的转储(dump)文件,甚至可以不再使用上面所提的 set autocommit=0; … commit; 。

9. 小心 insert 集全的大回滚(roolback):在插入时 InnoDB 使用插入缓冲来减少磁盘 I/O,但在相应的回滚中却没有使用这样的机制。一个 disk-bound rollback 可能会花费相应插入时间的 30 倍。如果发生一个失控的回滚,你可以查看第 6.1 章节的技巧来停止它。

10. 同样也要小心一个大的 disk-bound 的操作。使用 Drop TABLE 或 TRUNCATE (从 MySQL-4.0 以上) 来清空一个表,而不要使用 Delete FROM yourtable。

11. 如果需要插入大量记录行可以使用多行(multi-line)的 Insert 来减少客户端与服务器端的通信开销:

Insert INTO yourtable VALUES (1, 2), (5, 5);

这个技巧对插入任何表均有效,而不仅仅是 InnoDB。

12. 如果在辅键上有 UNIQUE 约束,从 3.23.52 和 4.0.3 开始,可以通过在一个导入会话中将唯一键检查(uniqueness check)关闭来提高数据导入速度:

SET UNIQUE_CHECKS=0;

一个大的表导入这将减少大量的磁盘 I/O,因为这时 InnoDB 可能使用自身的插入缓冲来分批地记录辅助索引。

13. 如果在表中有一个子 FOREIGN KEY 约束,从 3.23.52 和 4.0.3 开始,可以通过在一个导入会话中将外键检查(foreign key check)关闭来提高数据导入速度:

SET FOREIGN_KEY_CHECKS=0;

对一个大的表导入这将减少大量的磁盘 I/O。

可以先取消外键,修改完后再加回来。当然这也是可以的,虽然比较费事。

mysql提供了一个方法,临时关闭外键约束,当修改完成之后再将外键约束加回来。

讲你需要的操作放在两个语句之间:

SET FOREIGN_KEY_CHECKS = 0;
/* DO WHAT YOU NEED HERE */
SET FOREIGN_KEY_CHECKS = 1;

 

 

参考推荐:

MySQL 数据类型

MySQL 中的 NULL 和 空字符(”) 区别

MySQL 查询语句取整数或小数

MySQL 正则表达式查询

MySQL 时间函数加减计算

MySQL 日期和时间函数详解

MySQL 连接查询join详解

MySQL 联合查询union详解

MySQL 函数 group_concat

MySQL 中 case when 语句用法

MySQL 中 distinct 和 group by 性能比较

MySQL中distinct和group by过滤删除重复行

MySQL 数据库 User表权限以及用户授权详解

MySQL 字段中区分字符串大小写的解决方法

MySQL 字段的添加前缀、去掉前缀等字符串操作

MySQL中大于小于,IN,OR,BETWEEN性能比较

PHP MySQL中 uft-8中文编码乱码的解决办法

MySQL 中 insert ignore into, replace into 用法总结

Python创建MySQL数据库/表/存储过程

MySQL alter 修改表、字段等信息

MySQL 存储引擎 TokuDB

单机开启多个 MySQL 实例

MySQL 内存调优

MySQL 执行 SQL 及慢查询监控

MySQL: 一个参数引起的宕机血案

淘宝分享:跳出MySQL的10个大坑

MySQL 删除数据后物理空间未释放

MySQL 删除100G大表中的绝大部分数据

Python连接MySQL、MongoDB、Redis、memcache