龙空技术网

MySQL大批量插入数据优化

贵哥说Java创业 130

前言:

眼前看官们对“mysqlsql批量插入”大体比较注重,各位老铁们都想要知道一些“mysqlsql批量插入”的相关文章。那么小编也在网摘上网罗了一些关于“mysqlsql批量插入””的相关资讯,希望我们能喜欢,各位老铁们快快来了解一下吧!

当用 load 命令导人数据的时候,适当的设置可以提高导入的速度。

MyISAM

对于MyISAM 存储引擎的表,可以通过以下方式快速地导人大量的数据.

ALTER TABLE tb1_name DISABLE KEYS;loading the dataALTER TABLE tb1_name ENABLE KEYS;

DISABLE KEYS和ENABLE KEYS用来打开或者关闭 MyISAM表非唯一索引的更新。在导人大量的数据到一个非空的 MyISAM 表时,通过设置这两个命令,可以提高导人的效率。对于导入大量数据到一个空的 MyISAM 表,默认就是先导入数据然后才创建索引的,所以不用进行设置。

下面的例子中,用LOAD语句导人数据耗时115.12秒:

mysql> load data infile '/home/mysql/film_test,txt' into table film_test2;Query OK,529056 rows affected (1 min 5512 sec)Records: 529056 Deleted: 0 skipped: 0 warnings:0

而用alter table tbl name disable keys 方式总耗时 6.34+12.25 =18.59 秒,提高了6倍多

mysqi> alter table film_test2 disable keys;Query OK,0 rows affected (0.00 sec)mysql> load data infile '/home/mysql/film_test,txt' into table film_test2;Query OK,529056 rows affected (6,34 sec)Recards: 529056 Deleted: 0 skipped: 0 warnings: 0mysq1> alter table film_test2 enable keys;Query 0k,0 rows affected (12,25 sec)

上面是对MyISAM表进行数据导人时的优化措施,对于InnoDB 类型的表,这种方式并不能提高导入数据的效率。

InnoDB

(1)因为 InnoDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效地提高导入数据的效率。

例如,下面的文本 flm test3.xt 是按表 flm_test4 的主键存储的,那么导入时共耗27.92秒

mysq1s>load data infile '/home/mysq1/fimtest3.txt’into table fim_test4;Query oK,1587168 rows affected (22.92 sec)Records: 1587168 Deleted: 0 skipped: 0 warnings:0

而下面的flm test4.txt 是没有任何顺序的文本,那么导入时共耗时 31.16秒

mysql> load data infile "/home/mysql/film_test4.txt' into table fi1m_test4;Query 0K,1587168 rows affected (31.16 sec)Records: 1587168 Deleted: 0 skipped: 0 warnings:0

从上而的例子可以看出,当被导入的文件按表主键顺序存储时比不按主键顺序存储时快1.12倍。

(2)在导入数据前执行SET UNIQUE CHECKS=0,关闭唯一性校验,在导入结束后执行SETUNIQUE CHECKS=1,恢复唯一性校验,可以提高导入的效率例如,当UNIOUE CHECKS=1时:

mysql> load data infile '/home/mysql/film_test3,txt' into table film.test4;Query OK,1587168 rows affected (22.92 sec)Records: 1587168 Deleted: 0 skipped: 0 warnings: 0

当SET UNIOUE CHECKS=0 时:

mysql> load data infile '/home/mysql/fiim_test3,txt' into table film_test4;Query OK,1587168 rows affected (19.92 sec)Records; 1587168 Deleted: 0 Skipped: 0 warnings; 0

可见UNIOUE CHECKS=0时比 SETUNIOUE CHECKS=1 时要快一些。

(3)如果应用使用自动提交的方式,建议在导入前执行 SET AUTOCOMMIT=0,关闭自司提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导人的效率。

例如,当AUTOCOMMIT=I时:

mysql> load data infile '/home/mysql/film_test3.txt' into table film_test4;Query oK,1587168 rows affected (22.92 sec)Records: 1587168 Deleted: 0 skipped: 0 warnings: 0

当AUTOCOMMIT-0时:

mysql> lond data infile '/home/mysql/film_test3,txt' into table fim_test4;Ouery ox,1587168 rows affected (20.87 sec)Records; 1587168 Deleted: 0 skipped: 0 warnings: 0

对比一下可以知道,当AUTOCOMMIT=0时比AUTOCOMMIT=1时导人数据要快一些。

标签: #mysqlsql批量插入