mysql 导入数据太慢,来教你实用干货

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 还在等什么,快来关注我,以及公众号【八点半技术站】,加入社群一起讨论吧


喜欢就 关注 我们吧!


简介:

Hello 各位 ,我是公号「八点半技术站」的创作者 - Bruce.D (姓氏:豆)。


感谢微信给予的个人认证,专注于PHP、数据库技术领域知识经验分享。


技术的交流、不仅仅限制于阅读,在此欢迎各路大神、小白,来「wx技术群」分享自己的编程经验心得 与 技术实战干货。




概述:

本篇讲解:如何快速导入由逻辑备份产生的SQL脚本,其他文件形式暂不讲解


日常开发中,大家肯定遇到过这些需求:“ 数据迁移、数据恢复、新建从库 ” 等等一系列任务,因为做这些需求我们肯定知道,会涉及到 大量的数据 的处理。


大量的数据,会导致我们处理数据进度有时会很慢很慢,那么我们总得找一些方案来解决,对吧。


其实,这也是有一些小技巧的,可以大大增加我们数据的处理速度,那么就开始吧~~~



小技巧 - 方案一

开场先注意:导出 或 导入数据,尽可能的使用 MySQL 自带命令工具 ,不要使用一些图形化的工具 (Navicat...)。因为 MySQL 命令行工具至少要比图形化工具快 2 倍 。


命令工具行方式:


# 导出整个实例mysqldump -u用户名 -p密码 --all-databases > all_database.sql
# 导出指定库mysqldump -u用户名 -p密码 --databases testdb > testdb.sql
# 导出指定表mysqldump -u用户名 -p密码 testdb test_tb > test_tb.sql
# 导入指定SQL文件 (指定导入testdb库中)mysql -u用户名 -p密码 testdb < testdb.sql



小技巧 - 方案二

修改参数方式:


在 MySQL 中,有这么一对参数很有意思,分别是:


“ innodb_flush_log_at_trx_commit ”       与“ sync_binlog ”


安全性考虑,这个参数默认是 1 ,为了快速导入sql 数据,可临时修改默认参数值。


参数一: 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(刷到磁盘)中去。


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 脚本开头增加:


set sql_log_bin=0;

然后继续执行导入,这样速度也会加快。(如MySQL没开启binlog,则无需执行该语句)



到这里也就结束了,首先恭喜你又阅读完一篇文章,如果你认为有收获那么收藏转发起来,帮助需要的伙伴。


方案方式很多,就看你是否越意去研究、去发现,欢迎评论区留言~~~




同时,为了方便大家学习,我会把一些源码、技术干货存储到 github 中,随时可以在微信群 进行交流,扫下面二维码 ,备注 “技术进群” 就可以通过审核。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
mysql实现学生管理系统的连接(从数据库导入数据)
mysql实现学生管理系统的连接(从数据库导入数据)
|
SQL 关系型数据库 MySQL
mysql 的sql太慢怎么调优
mysql 的sql太慢怎么调优
116 0
|
6月前
|
SQL 关系型数据库 MySQL
MYSQL分页limit速度太慢优化方法
MYSQL分页limit速度太慢优化方法
74 0
|
SQL 关系型数据库 MySQL
一次性导入千万级数据到Mysql(附源码)
MySql数据迁移、导入,在我们日常开发中,可以说是经常碰到。如果数据量比较小,一般都没什么问题,但是如果是涉及到千万级、亿级的数据量大数据量迁移,这里面就涉及到一个问题:如何快速导入千万数据到MySQL。 下面我们通过对比3种方法,来谈谈MySQL怎么高性能插入千万级的数据。
1695 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL in 太慢的 3 种优化方案
MySQL中的`eq_range_index_dive_limit`参数默认值为200,影响了IN查询的执行方式。当IN列表项少于这个值时,MySQL会使用扫描索引树(精确成本计算),而多于此值则使用索引统计(快速但可能不准)来分析查询成本。大量IN值可能导致性能下降。解决方案包括:1) 分批查询;2) 使用UNION ALL创建内存临时表;3) 创建实体表存储IN值并进行JOIN操作。注意,实体表需及时清理并避免反复插入删除导致性能下降。
1067 0
|
6月前
|
分布式计算 关系型数据库 MySQL
oceanbase-oracle/mysql 如何导入数据
oceanbase-oracle/mysql 如何导入数据
|
6月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之在 DataWorks 中使用数据集成从 MySQL 导入数据到 GDB 执行同步任务脚本的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
73 0
|
6月前
|
存储 关系型数据库 MySQL
Python导入Excel数据到MySQL数据库
Python导入Excel数据到MySQL数据库
470 1
|
6月前
|
前端开发 关系型数据库 MySQL
MYSQL 中如何导入数据?
MYSQL 中如何导入数据?
82 0
|
关系型数据库 MySQL 数据库连接
一次性导入千万级数据到Mysql(附源码)
一次性导入千万级数据到Mysql(附源码)
553 0
下一篇
无影云桌面