MySQL如何快速导⼊数据
前⾔:
⽇常学习和⼯作中,经常会遇到导数据的需求。⽐如数据迁移、数据恢复、新建从库等,这些操作可能都会涉及⼤量数据的导⼊。有时候导⼊进度慢,电脑风扇狂转真的很让⼈崩溃,其实有些⼩技巧是可以让导⼊更快速的,本篇⽂章笔者会谈⼀谈如何快速的导⼊数据。
spss随机数字表法分组>转换 uniqueidentifier时失效注:本篇⽂章只讨论如何快速导⼊由逻辑备份产⽣的SQL脚本,其他⽂件形式暂不讨论。
1.尽量减⼩导⼊⽂件⼤⼩
⾸先给个建议,导出导⼊数据尽量使⽤MySQL⾃带的命令⾏⼯具,不要使⽤Navicat、workbench等图形化⼯具。特别是⼤数据量的时候,⽤MySQL⾃带的命令⾏⼯具导出和导⼊⽐⽤Navicat等图形化⼯具要快数倍,⽽且⽤Navicat等图形化⼯具做⼤数据量的操作时很容易卡死。下⾯简单介绍下怎么⽤MySQL⾃带的命令⾏⼯具做导⼊导出。
# 导出整个实例
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql
# 导出指定库
mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql
# 导出指定表
mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql
# 导⼊指定SQL⽂件(指定导⼊testdb库中)
mysql -uroot -pxxxxxx testdb < testdb.sql
导⼊的SQL脚本内容⼤多是先建库建表,然后插⼊数据,其中耗时最长的应该是insert插⼊数据了。为了减⼩⽂件⼤⼩,推荐使⽤扩展插⼊⽅法,即多⾏⼀起批量insert,类似这样:insert into table_name values (),(),(),...,(); 。使⽤扩展插⼊⽐⼀条条插⼊,⽂件⼤⼩要⼩很多,插⼊速度要快好⼏倍。使⽤mysqldump导出的⽂件默认是使⽤批量插⼊的⽅法,导出时可使⽤--skip-extended-insert 参数改为逐条插⼊。下⾯以⼀张⼀千万的数据表为例,测试下不同⽅式导出的⽂件插⼊时的速度。
上图可以看出,使⽤扩展插⼊的SQL脚本导⼊⼤概需要10分钟左右,⽽⼀条条插⼊的SQL脚本导⼊时间过长,⼤概1个⼩时仍然没有导完,⼀个2个多G的⽂本导⼊⼀个多⼩时仍未结束,等不及的笔者就⼿动取消了? 不过还是可以看出多条⼀起insert⽐⼀条条插⼊数据要节省数倍的时间。
2.尝试修改参数加快导⼊速度
mysql面试题导图在MySQL中,有⼀对⼤名⿍⿍的“双⼀”参数,即 innodb_flush_log_at_trx_commit 与 sync_binlog 。为了安全性这两个参数默认值为1,为了快速导⼊脚本,我们可以临时修改下这两个参数,下⾯简单介绍下这两个参数:
innodb_flush_log_at_trx_commit默认值为1,可设置为0、1、2
如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒⼀次地写⼊log file中,并且log file的flush(刷到磁
盘)操作同时进⾏.该模式下,在事务提交的时候,不会主动触发写⼊磁盘的操作。
如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写⼊log file,并且
flush(刷到磁盘)中去.
selenium定位
如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写⼊log file.但是
flush(刷到磁盘)操作并不会同时进⾏。该模式下,MySQL会每秒执⾏⼀次 flush(刷到磁盘)操作。
sync_binlog默认值为1,可设置为[0,N)
当sync_binlog =0,像操作系统刷其他⽂件的机制⼀样,MySQL不会同步到磁盘中去⽽是依赖操作系统来刷新
binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次⼆进制⽇志binary log时,会使⽤fdatasync()函数将它的写⼆进制⽇志binary log同步到磁盘中去。
这两个参数可以在线修改,若想快速导⼊,可以按照下⾯步骤来操作:
# 1.进⼊MySQL命令⾏临时修改这两个参数
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;
# 2.执⾏SQL脚本导⼊
mysql -uroot -pxxxxxx testdb < testdb.sql
# 3.导⼊完成再把参数改回来
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;
还有另外⼀种场景是你的需求是新建从库,或者是不需要产⽣binlog,这时候导⼊SQL脚本时可以设置暂时不记录binlog,可以在脚本开头增加 set sql_log_bin=0; 然后再执⾏导⼊,这样速度会进⼀步加快。如果你的MySQL实例没有开启binlog则不需要再执⾏该语句了。
总结:java设计模式分为三大类
本篇⽂章主要介绍快速导⼊数据的⽅法,可能还有其他⽅法快速导⼊数据,⽐如load data或者写程序多线程插⼊。本⽂中介绍的⽅法只适合⼿动导⼊SQL脚本,下⾯总结下本⽂中提到的⽅法。
1. 使⽤MySQL⾃带的命令⾏⼯具进⾏导出导⼊。
2. 使⽤扩展插⼊⽅法,⼀个insert对于多个值。
3. 临时修改innodb_flush_log_at_trx_commit和sync_binlog参数。
4. 关闭binlog或者临时不记录binlog。
其实还有⼀些其他⽅案,⽐如先不创建索引,插⼊数据后再执⾏添加索引操作;或者先将表改为MyISAM或MEMORY引擎,导⼊完成后再改为InnoDB引擎。不过这两种⽅法实施起来较为⿇烦且不知效果如何。以上⽅法只是笔者依据个⼈经验总结得出,可能不太全⾯,欢迎各位补充哦。jquery手写图片大全
以上就是MySQL如何快速导⼊数据的详细内容,更多关于MySQL导⼊数据的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。