mysql 优化配置 大批量数据插入_[译] MySQL 最佳实践 —— 高效插入数据

4b57a3cbbbd834e1b19b6f0daeaaf335.png

087ac08f614e5a1e486d7d103c866428.png

当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法。

MySQL 文档中有些值得一读的 INSERT 优化技巧

在这篇文章里,我将概述高效加载数据到 MySQL 数据库的两大技术。

LOAD DATA INFILE

如果你正在寻找提高原始性能的方案,这无疑是你的首选方案。LOAD DATA INFILE 是一个专门为 MySQL 高度优化的语句,它直接将数据从 CSV / TSV 文件插入到表中。

有两种方法可以使用 LOAD DATA INFILE。你可以把数据文件拷贝到服务端数据目录(通常 /var/lib/mysql-files/),并且运行:

LOAD DATA INFILE '/path/to/products.csv' INTO TABLE products;

这个方法相当麻烦,因为你需要访问服务器的文件系统,为数据文件设置合适的权限等。

好消息是,你也能将数据文件存储在客户端,并且使用 LOCAL 关键词:

LOAD DATA LOCAL INFILE '/path/to/products.csv' INTO TABLE products;

在这种情况下,从客户端文件系统中读取文件,将其透明地拷贝到服务端临时目录,然后从该目录导入。总而言之,这几乎与直接从服务器文件系统加载文件一样快,不过,你需要确保服务器启用了此 选项

LOAD DATA INFILE 有很多可选项,主要与数据文件的结构有关(字段分隔符、附件等)。请浏览 文档 以查看全部内容。

虽然从性能角度考虑, LOAD DATA INFILE 是最佳选项,但是这种方式需要你先将数据以逗号分隔的形式导出到文本文件中。如果你没有这样的文件,你就需要花费额外的资源来创建它们,并且可能会在一定程度上增加应用程序的复杂性。幸运的是,还有一种另外的选择。

扩展的插入语句(Extended inserts)

一个典型的 INSERT SQL 语句是这样的:

INSERT INTO user (id, name) VALUES (1, 'Ben');

extended INSERT 将多条插入记录聚合到一个查询语句中:

INSERT INTO user (id, name) VALUES (1, 'Ben'), (2, 'Bob');

关键在于找到每条语句中要插入的记录的最佳数量。没有一个放之四海而皆准的数字,因此,你需要对数据样本做基准测试,以找到性能收益的最大值,或者在内存使用和性能方面找到最佳折衷。

为了充分利用 extended insert,我们还建议:

  • 使用预处理语句
  • 在事务中运行该语句

基准测试

我要插入 120 万条记录,每条记录由 6 个 混合类型数据组成,平均每条数据约 26 个字节大小。我使用了两种常见的配置进行测试:

  • 客户端和服务端在同一机器上,通过 UNIX 套接字进行通信
  • 客户端和服务端在不同的机器上,通过延迟非常低(小于 0.1 毫秒)的千兆网络进行通信

作为比较的基础,我使用 INSERT ... SELECT 复制了该表,这个操作的性能表现为每秒插入 313,000 条数据

LOAD DATA INFILE

令我吃惊的是,测试结果证明 LOAD DATA INFILE 比拷贝表更快

  • LOAD DATA INFILE:每秒 377,000 次插入
  • LOAD DATA LOCAL INFILE 通过网络:每秒 322,000 次插入

这两个数字的差异似乎与从客户端到服务端传输数据的耗时有直接的关系:数据文件的大小为 53 MB,两个基准测试的时间差了 543 ms,这表示传输速度为 780 mbps,接近千兆速度。

这意味着,很有可能,在完全传输文件之前,MySQL 服务器并没有开始处理该文件:因此,插入的速度与客户端和服务端之间的带宽直接相关,如果它们不在同一台机器上,考虑这一点则非常重要。

Extended inserts

我使用 BulkInserter 来测试插入的速度,BulkInserter 是我编写的 开源库 PHP 类的一部分,每个查询最多插入 10,000 条记录:

83c8e780b78ed069d6f464ccca2a1dd0.png

正如我们所看到的,随着每条查询插入数的增长,插入速度也会迅速提高。与逐条插入速度相比,我们在本地主机上性能提升了 6 倍,在网络主机上性能提升了 17 倍:

  • 在本地主机上每秒插入数量从 40,000 提升至 247,000
  • 在网络主机上每秒插入数量从 1,2000 提升至 201,000

这两种情况都需要每个查询大约 1,000 个插入来达到最大吞吐量。但是每条查询 40 个插入就足以在本地主机上达到 90% 的吞吐量,这可能是一个很好的折衷。还需要注意的是,达到峰值之后,随着每个查询插入数量的增加,性能实际上是会下降。

extended insert 的优势在网络连接的情况下更加明显,因为连续插入的速度取决于你的网络延迟。

max sequential inserts per second ~= 1000 / ping in milliseconds

客户端和服务端之间的延迟越高,你从 extended insert 中获益越多。

结论

不出所料,LOAD DATA INFILE 是在单个连接上提升性能的首选方案。它要求你准备格式正确的文件,如果你必须先生成这个文件,并/或将其传输到数据库服务器,那么在测试插入速度时一定要把这个过程的时间消耗考虑进去。

另一方面,extended insert 不需要临时的文本文件,并且可以达到相当于 LOAD DATA INFILE 65% 的吞吐量,这是非常合理的插入速度。有意思的是,无论是基于网络还是本地主机,聚集多条插入到单个查询总是能得到更好的性能

如果你决定开始使用 extended insert,一定要先用生产环境的数据样本和一些不同的插入数来测试你的环境,以找出最佳的数值。。

在增加单个查询的插入数的时候要小心,因此它可能需要:

  • 在客户端分配更多的内存
  • 增加 MySQL 服务器的 max_allowed_packet 参数配置。

最后,值得一提的是,根据 Percona 的说法,你可以使用并发连接、分区以及多个缓冲池,以获得更好的性能。更多信息请查看 他们博客的这篇文章

基准测试运行在装有 Centos 7 和 MySQL 5.7 的裸服务器上,它的主要硬件配置有 Xeon E3 @3.8 GHz 处理器,32 GB RAM 和 NVMe SSD。MySQL 的基准表使用 InnoBD 存储引擎。

基准测试的源代码保存在 gist 上,结果图保存在 plot.ly 上。

  • 原文地址:High-speed inserts with MySQL
  • 原文作者:Benjamin Morel
  • 译文出自:掘金翻译计划
  • 译者:司徒公子
  • 校对者:GJXAIOUQinRoc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 移植游戏,Unity游戏移植到Android平台

很多时候不仅需要单纯的运行单个的unity游戏,而是需要将游戏嵌入Android代码中和android其他功能相辅生成一个APP,比如通过android界面的一个按钮来启动一个unity游戏。本文介绍一下主要的过程。1. 将可运行的unity游戏打包为Android project。在Unity界…

code vs 代码格式化排版_23行代码,教你用python实现百度翻译!(建议收藏)

前言:努力折腾的人生虽然不是符合完美生活,但它一定是个很精彩的人生!生命在于折腾,正如敲代码一样,你们说是吗?文章主要介绍了用23行python代码实现百度翻译,颇有参考性,喜欢的记得…

mete30是鸿蒙系统么,华为mete30pro什么时候能用上鸿蒙系统?

[其他]华为mete30pro什么时候能用上鸿蒙系统?8957电梯直达huafans01303113614新学乍练发表于 2021-4-21 21:43:19来自:HUAWEI Mate 30 Pro 5G最新回复 2021-4-22 12:10:10华为mete30pro什么时候能用上鸿蒙系统?能有确切的时间吗伊凡爱尔顿已臻…

python运算符中用来计算整商的是什么_零基础学python,看完这篇文章,你的python基础就差不多了...

Python基础语法1. 认识Python1.1 Python 简介Python 的创始人为吉多范罗苏姆(Guido van Rossum)。Python 的设计目标:一门简单直观的语言并与主要竞争者一样强大开源,以便任何人都可以为它做贡献代码像纯英语那样容易理解适用于短…

华为鸿蒙os系统转正,华为鸿蒙OS系统正式官宣,转正工作提上日程,明年多款终端将使用...

华为鸿蒙OS系统相信很多小伙伴都不陌生,作为国内现如今顶尖的科技企业。华为这些年的发展也是十分迅速的,而再快速的发展过程中。更多的用户对于华为的新款系统也充满了好奇,要知道一款属于国人自己的国产系统。在之前的国内手机上是几乎不存…

map型字段 mongodb_MongoDB极简教程

来源:我没有三颗心脏1.MongDB 简介MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB 的数据模式可以随着应用程序的发展…

html 如何改变图片形状,图形变换的三种方式是什么?

图形变换的三种方式1、平移平移,是指在同一平面内,将一个图形上的所有点都按照某个直线方向做相同距离的移动,这样的图形运动叫做图形的平移运动,简称平移。平移不改变图形的形状和大小。图形经过平移,对应线段相等&am…

Trie树(字典树)详细知识点及其应用

Trie,又经常叫前缀树,字典树等等。它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree。当然很多名字的意义其实有交叉。 定义 在计算机科学中,trie&#x…

aip格式转化为pdf_python提取pdf文档中的表格数据、svg格式转换为pdf

提取pdf文件中的表格数据原文链接https://www.analyticsvidhya.com/blog/2020/08/how-to-extract-tabular-data-from-pdf-document-using-camelot-in-python/另外还参考了这篇文章https://camelot-py.readthedocs.io/en/master/实现提取pdf文档中的表格数据需要使用camelot模块…

html验证邮箱自动,html5+JavaScript进行邮箱地址验证

html5 网页特效 邮箱地址验证body, input, textarea {font-family: "helvetica", arial, helvetica;}label {display: block;float: left;clear: left;text-align: right;width: 100px;margin-right: 10px;}p { padding: 10px; }fieldset { border: 1px solid #ccc; …

6 rethad 自定义硬盘_图文详解zabbix配置自定义监控项过程

概述今天主要介绍一下zabbix如何去配置自定义监控模板,下面一起来看看吧!一、模板1、概念模板(template):可以应用到主机上的实体(包括监控项、触发器、数据图、图表、监控分类、低级的自动发现规则)的集合。当一个模板被应用到一个主机后&am…

【HDU - 1085 】Holding Bin-Laden Captive! (母函数)

题干: We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China! “Oh, God! How terrible! ” Don’t be so afraid, guys. Although he hides in a…

html超链接点不了_HTML、CSS、JS都有哪些区别?不看必悔

划重点HTML、CSS、及JS的区别有哪些?在日常学习中,html,css和js我们都学过,起初分不清这三者的区别和联系,随着知识的增长,有了一些体会。看一下这三项技术都是什么,能干什么?web前端…

2019游戏 f1_2019年F1中国大奖赛激情开跑,这款手游带你体验真实F1的魅力

不知不觉,F1中国大奖赛进入第16个年头。你是否还记得2018年的F1中国大奖赛,真是跌宕起伏,红牛队车手里卡多在第三次练习赛中爆缸,之后在车队技师的努力下才赶上排位赛,结果他在正赛时第6位发车,竟然超出对手…

docker jenkins 公钥_代码自动发布docker(20.10.1)+k8s(1.20.1)

PaaS平台Docker版本(20.10.1) 2020-12-15 k8s版本(1.20.1) 2020-12-19代码托管:https://github.com/kubernetes/官方网址:https://kubernetes.io/pod--容器外壳service--不是真正的服务是iptables或ipvs中的规则先创建pod,后创建service…

【HDU - 1272】小希的迷宫 (并查集判环)

题干: 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B&…

东北育才高中2021年高考成绩查询,东北育才学校国际部2021年招生计划

学校每年的招生计划都会发生变化,并不是一成不变的,所以大家一定要时刻关注招生计划。在报考一所学校的时候,大家要有计划性的选择报考学校,要先去了解学校大概招收多少学生,这样大家在报考学校时候的才能更好地去选择…

html启动word程序,Word工具栏直接启动外部程序

Word工具栏直接启动外部程序互联网 发布时间:2008-10-06 15:13:37 作者:佚名 我要评论从Word工具栏中也能直接启动外部程序,这样操作起来非常方便。我们以从Word启动计算器举例说明。单击“工具”菜单下的“自定义”命令,打…

linux ip brd不一致_3 个方便的命令行网速度测试工具 | Linux 中国

用这三个开源工具检查你的互联网和局域网速度。-- Ben Nuttall能够验证网络连接速度使您可以控制计算机。使您可以在命令行中检查互联网和网络速度的三个开源工具是 Speedtest、Fast 和 iPerf。SpeedtestSpeedtest 是一个旧宠。它用 Python 实现,并打包在 Apt 中&am…

语言nomogram校准曲线图_R语言实现Cox模型校准度曲线绘制

01研究背景这是关于cox模型的第二篇文章,上一篇文章分享了运用Lasso回归如何筛选变量,将筛选后的变量绘制Nomogram图,本章分享构建模型后,如何绘制校准曲线。cox模型的验证不同于Logistic回归,cox的结局包括时间和状态…