【笔记】最佳实践—如何优化数据导入导出

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 数据库实际应用场景中经常需要进行数据导入导出,本文将介绍如何使用数据导入导出工具。

测试环境

本文档的测试环境要求如下表:

环境 参数
PolarDB-X版本 polarx-kernel_5.4.11-16282307_xcluster-20210805
节点规格 16核64GB
节点个数 4个

测试用表如下:


CREATE TABLE `sbtest1` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    `c` char(120) NOT NULL DEFAULT '',
    `pad` char(60) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `k_1` (`k`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

导入导出工具介绍

PolarDB-X常见的数据导出方法有:

  • mysql -e命令行导出数据
  • musqldump工具导出数据
  • select into outfile语句导出数据(默认关闭)
  • Batch Tool工具导出数据(PolarDB-X配套的导入导出工具)

PolarDB-X常见的数据导入方法有:

  • source语句导入数据
  • mysql命令导入数据
  • 程序导入数据
  • load data语句导入数据
  • Batch Tool工具导入数据(PolarDB-X配套的导入导出工具)

MySQL原生命令使用示例

mysql -e命令可以连接本地或远程服务器,通过执行sql语句,例如select方式获取数据,原始输出数据以制表符方式分隔,可通过字符串处理改成','分隔,以csv文件方式存储,方法示例:


mysql -h ip  -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM sbtest1;" >/home/data_1000w.txt

## 原始数据以制表符分隔,数据格式:188092293 27267211 59775766593-64673028018-...-09474402685 01705051424-...-54211554755
mysql -h ip -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM sbtest1;" | sed 's/\t/,/g' >/home/data_1000w.csv
## csv文件以逗号分隔,数据格式:188092293,27267211,59775766593-64673028018-...-09474402685,01705051424-...-54211554755

原始数据格式适合load data语句导入数据,使用方法可参考:LOAD DATA 语句,示例如下:


LOAD DATA LOCAL INFILE '/home/data_1000w.txt' INTO TABLE sbtest1;
## LOCAL代表从本地文件导入,local_infile参数必须开启

csv文件数据适合程序导入,具体方式可查看使用程序进行数据导入

mysqldump工具使用示例

mysqldump工具可以连接到本地或远程服务器,详细使用方法请参见使用mysqldump导入导出数据

  • 导出数据示例:
mysqldump -h ip  -P port -u usr -pPassword --default-character-set=utf8mb4 --net_buffer_length=10240 --no-tablespaces --no-create-db --no-create-info --skip-add-locks --skip-lock-tables --skip-tz-utc --set-charset  --hex-blob db_name [table_name] > /home/dump_1000w.sql
  • mysqldump导出数据可能会出现的问题及解决方法,这两个问题通常是mysql client和mysql server版本不一致导致的。
    1. 问题:mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'gtid\_mode''解决方法:添加“--set-gtid-purged=OFF”参数关闭gtid_mode。
    2. 问题:mysqldump: Couldn't execute 'SHOW VARIABLES LIKE 'ndbinfo\_version''解决方法:查看mysqldump --version和mysql版本是否一致,使用和mysql版本一致的mysql client。
  • 导出的数据格式是SQL语句方式,以Batch Insert语句为主体,包含多条SQL语句,INSERT INTO `sbtest1` VALUES (...),(...),“net_buffer_length”参数将影响batch size大小。
  • SQL语句格式合适的导入数据方式:
方法一:souce语句导入数据

source /home/dump_1000w.sql
方法二:mysql命令导入数据
mysql -h ip -P port -u usr -pPassword --default-character-set=utf8mb4 db_name < /home/dump_1000w.sql

Batch Tool工具使用示例

Batch Tool是阿里云内部开发的数据导入导出工具,支持多线程操作。

  • 导出数据:
## 导出“默认值=分片数”个文件
java -jar batch-tool.jar -h ip -P port -u usr -pPassword -D db_name -o export -t sbtest1 -s ,
## 导出整合成一个文件
java -jar batch-tool.jar -h ip -P port -u usr -pPassword -D db_name -o export -t sbtest1 -s , -F 1
  • 导入数据:
## 导入32个文件
java -jar batch-tool.jar -hpxc-spryb387va1ypn.polarx.singapore.rds.aliyuncs.com -P3306 -uroot -pPassw0rd -D sysbench_db -o import -t sbtest1 -s , -f "sbtest1_0;sbtest1_1;sbtest1_2;sbtest1_3;sbtest1_4;sbtest1_5;sbtest1_6;sbtest1_7;sbtest1_8;sbtest1_9;sbtest1_10;sbtest1_11;sbtest1_12;sbtest1_13;sbtest1_14;sbtest1_15;sbtest1_16;sbtest1_17;sbtest1_18;sbtest1_19;sbtest1_20;sbtest1_21;sbtest1_22;sbtest1_23;sbtest1_24;sbtest1_25;sbtest1_26;sbtest1_27;sbtest1_28;sbtest1_29;sbtest1_30;sbtest1_31" -np -pro 64 -con 32
## 导入1个文件
java -jar batch-tool.jar -h ip -P port -u usr -p password -D db_name -o import -t sbtest1 -s , -f "sbtest1_0" -np

导出方法对比

测试方法以PolarDB-X导出1000w行数据为例,数据量大概2GB左右。

方式 数据格式 文件大小 耗时 性能(行/每秒) 性能(MB/S)
mysql -e命令 导出原始数据 原始数据格式 1998MB 33.417s 299248 59.8
mysql -e命令导出csv格式 csv格式 1998MB 34.126s 293031 58.5
mysqldump工具(net-buffer-length=10KB) sql语句格式 2064MB 30.223s 330873 68.3
mysqldump工具(net-buffer-length=200KB) sql语句格式 2059MB 32.783s 305036 62.8
batch tool工具文件数=32(分片数) csv格式 1998MB 4.715s 2120890 423.7
batch tool工具文件数=1 csv格式 1998MB 5.568s 1795977 358.8

总结:

  1. mysql -e命令和mysqldump工具原理上主要是单线程操作,性能差别并不明显。
  2. Batch Tool工具采用多线程方式导出,并发度可设置,能够极大提高导出性能。

导入方法对比

测试方法以PolarDB-X导入1000w行数据为例,源数据是上一个测试中导出的数据,数据量大概2GB左右。

方式 数据格式 耗时 性能(行/每秒) 性能(MB/S)
source语句(net-buffer-length=10KB) sql语句格式 10m24s 16025 3.2
source语句(net-buffer-length=200KB) sql语句格式 5m37s 29673 5.9
mysql命令导入(net-buffer-length=10KB) sql语句格式 10m27s 15948 3.2
mysql命令导入(net-buffer-length=200KB) sql语句格式 5m38s 29585 5.9
load data语句导入 原始数据格式 4m0s 41666 8.3
程序导入batch-1000thread-1 csv格式 5m40s 29411 5.9
程序导入batch-1000thread-32 csv格式 19s 526315 105.3
batch tool工具文件数=32(分片数) csv格式 19.836s 504133 100.8
batch tool工具文件数=1 csv格式 10.806s 925411 185.1

总结:

  1. source语句和mysql命令导入方式,都是单线程执行SQL语句导入,实际是Batch Insert语句的运用,Batch size大小会影响导入性能。Batch size和mysqldump导出数据时的“net-buffer-length”参数有关。建议优化点如下:
    • 推荐将“net-buffer-length”参数设置大,不超过256K,以增大batch size大小,来提高插入性能。
    • 使用第三方工具,例如mysqldump,进行mydumper(备份)和myloader(导入)等,可多线程操作。
  1. load data语句是单线程操作,性能优于mysql命令和source语句。
  2. 程序导入灵活性较好,可自行设置合适的batch size和并发度,可以达到较好性能。推荐batch大小为1000,并发度为16~32。
  3. Batch Tool工具支持多线程导入,且贴合分布式多分片的操作方式,性能优异。

总结

  1. PolarDB-X兼容MySQL运维上常用的数据导入导出方法,但这些方法大多为MySQL单机模式设计,只支持单线程操作,性能上无法充分利用所有分布式资源。
  2. PolarDB-X提供Batch Tool工具,非常贴合分布式场景,在多线程操作下,能够达到极快的数据导入导出性能。
相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
3月前
|
存储 算法 Cloud Native
【PolarDB-X列存魔法】揭秘TPC-H测试背后的性能优化秘籍!
【8月更文挑战第25天】阿里巴巴的云原生数据库PolarDB-X以其出色的性能、可靠性和扩展性闻名,在多种业务场景中广泛应用。尤其在列存储模式下,PolarDB-X针对分析型查询进行了优化,显著提升了数据读取效率。本文通过TPC-H基准测试探讨PolarDB-X列存执行计划的优化策略,包括高效数据扫描、专用查询算法以及动态调整执行计划等功能,以满足复杂查询的需求并提高数据分析性能。
94 1
|
3月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
56 0
|
5月前
|
存储 SQL 分布式计算
MaxCompute产品使用合集之作业性能优化的规范包括哪些
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
存储 SQL 关系型数据库
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
|
6月前
|
SQL 监控 测试技术
SQL语法优化与最佳实践
【2月更文挑战第28天】本章将深入探讨SQL语法优化的重要性以及具体的优化策略和最佳实践。通过掌握和理解这些优化技巧,读者将能够编写出更高效、更稳定的SQL查询,提升数据库性能,降低系统资源消耗。
|
存储 监控 关系型数据库
MySQL数据库查询性能优化的技巧和经验分享
MySQL数据库查询性能优化的技巧和经验分享
|
弹性计算 关系型数据库 数据库
PostgreSQL 高并发应用数据库设计与优化实践 PPT
标签 PostgreSQL , 高并发 , 数据库设计 , 优化 背景 PG生态 常见的高并发场景与业务 高并发场景带来的挑战 高并发场景数据库设计与优化 阿里RDS PG在高并发场景的内核改进 案例 PDF 《PostgreSQL 高并发应用数据库设计与优化实践》   免费领取阿里云RDS PostgreSQL实例、ECS虚拟机
973 0
|
SQL 运维 监控
PostgreSQL 性能优化和体系化运维(二)|学习笔记
快速学习 PostgreSQL 性能优化和体系化运维(二)
240 0
PostgreSQL 性能优化和体系化运维(二)|学习笔记
|
SQL 存储 Oracle
为 PolarDB 开发选择合适的工具 | 学习笔记
快速学习为 PolarDB 开发选择合适的工具,介绍了为 PolarDB 开发选择合适的工具系统机制, 以及在实际应用过程中如何使用。
为 PolarDB 开发选择合适的工具 | 学习笔记
|
缓存 运维 网络协议
PostgreSQL 性能优化和体系化运维(一)|学习笔记
快速学习 PostgreSQL 性能优化和体系化运维(一)
409 0