MySQL中怎么实现快速插入数据

39次阅读
没有评论

共计 2035 个字符,预计需要花费 6 分钟才能阅读完成。

自动写代码机器人,免费开通

MySQL 中怎么实现快速插入数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

MySQL 如何快速插入数据

1. 尽量减小导入文件大小

首先给个建议,导出导入数据尽量使用 MySQL 自带的命令行工具,不要使用 Navicat、workbench 等图形化工具。特别是大数据量的时候,用 MySQL 自带的命令行工具导出和导入比用 Navicat 等图形化工具要快数倍,而且用 Navicat 等图形化工具做大数据量的操作时很容易卡死。下面简单介绍下怎么用 MySQL 自带的命令行工具做导入导出。

#导出整个实例

mysqldump-uroot-pxxxxxx–all-databases all_database.sql

#导出指定库

mysqldump-uroot-pxxxxxx–databasestestdb testdb.sql

#导出指定表

mysqldump-uroot-pxxxxxxtestdbtest_tb test_tb.sql

#导入指定 SQL 文件 (指定导入 testdb 库中)

mysql-uroot-pxxxxxxtestdb

导入的 SQL 脚本内容大多是先建库建表,然后插入数据,其中耗时最长的应该是 insert 插入数据了。为了减小文件大小,推荐使用扩展插入方法,即多行一起批量 insert,类似这样:insertintotable_namevalues(),(),(),…,();。使用扩展插入比一条条插入,文件大小要小很多,插入速度要快好几倍。使用 mysqldump 导出的文件默认是使用批量插入的方法,导出时可使用 –skip-extended-insert 参数改为逐条插入。

可以看出,使用扩展插入的 SQL 脚本导入大概需要 10 分钟左右,而一条条插入的 SQL 脚本导入时间过长,大概 1 个小时仍然没有导完,一个 2 个多 G 的文本导入一个多小时仍未结束,等不及的笔者就手动取消了不过还是可以看出多条一起 insert 比一条条插入数据要节省数倍的时间。

2. 尝试修改参数加快导入速度

在 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,logbuffer 将每秒一次地写入 logfile 中,并且 logfile 的 flush(刷到磁盘) 操作同时进行. 该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。如果 innodb_flush_log_at_trx_commit 设置为 1,每次事务提交时 MySQL 都会把 logbuffer 的数据写入 logfile,并且 flush(刷到磁盘) 中去. 如果 innodb_flush_log_at_trx_commit 设置为 2,每次事务提交时 MySQL 都会把 logbuffer 的数据写入 logfile. 但是 flush(刷到磁盘) 操作并不会同时进行。该模式下,MySQL 会每秒执行一次 flush(刷到磁盘) 操作。

sync_binlog 默认值为 1,可设置为 [0,N)

当 sync_binlog=0,像操作系统刷其他文件的机制一样,MySQL 不会同步到磁盘中去而是依赖操作系统来刷新 binarylog。当 sync_binlog=N(N 0),MySQL 在每写 N 次二进制日志 binarylog 时,会使用 fdatasync() 函数将它的写二进制日志 binarylog 同步到磁盘中去。

MySQL 如何快速插入数据

这两个参数可以在线修改,若想快速导入,可以按照下面步骤来操作:

#1. 进入 MySQL 命令行临时修改这两个参数

setglobalinnodb_flush_log_at_trx_commit=2;

setglobalsync_binlog=2000;

#2. 执行 SQL 脚本导入

mysql-uroot-pxxxxxxtestdb

#3. 导入完成再把参数改回来

setglobalinnodb_flush_log_at_trx_commit=1;

setglobalsync_binlog=1;

还有另外一种场景是你的需求是新建从库,或者是不需要产生 binlog,这时候导入 SQL 脚本时可以设置暂时不记录 binlog,可以在脚本开头增加 setsql_log_bin=0; 然后再执行导入,这样速度会进一步加快。如果你的 MySQL 实例没有开启 binlog 则不需要再执行该语句了。

关于 MySQL 中怎么实现快速插入数据问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2035字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)