原文链接:https://www.cnblogs.com/blog5277/p/10658426.html

原文作者:博客园--曲高终和寡

*******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文****************

由于最近经过朋友启发,又有了一个写个人项目的小想法,在这次个人项目中准备学习并使用一些之前自己没有掌握的新技术,其中,在项目准备的时候,准备爬一些数据做储备。

过去的项目,都对数据写入没有硬性要求,所以之前就是写了爬虫放那不管了,这次由于项目的需求,需要大量快速的爬取/复制/写入数据,我就发现我现在用的Mysql并不能满足我的需求,奇慢无比。经过对比评测,初步决定选用PostgresQL替换掉Mysql。

〇:先摆结论

写入速度:

Mysql:  8.5/s

PostgresQL:   800/s

读取速度:

由于Mysql50W条数据之后反复出错,一段时间后就connection reset之类的,于是以PostgresQL100W数据,Mysql57W数据为基础做测试

Mysql:

PostgresQL:

结论,不论读写,PostgresQL在我这台机器上显著优于Mysql,所以我选择PostgresQL作为以后的数据库使用

一:前期调查

如果一个市场占有率小的数据库(根据谷歌趋势),口碑/媒体评测/个人评测都不如Mysql的话,那就不用考虑了。

经过调查,不管是百度、谷歌搜出来的绝大部分结果都是PostgresQL强得多,也符合我自己的评测结果。

有一个关于PostgresQL的负面新闻是,Uber从PostgresQL转为Mysql,但是经过更多的调查发现,这并不完全是PostgresQL的问题,比如如下文章:

http://www.sohu.com/a/108363951_465959

https://m.aliyun.com/yunqi/articles/79658

就解释了这个问题,我个人经过调研是更倾向于PostgresQL的

二:准备工作

1.一台阿里云服务器,1核2G1M带宽I/O优化硬盘(应该是SSD)

2.Mysql 5.7,PostgresQL 11(Mysql版本低是因为我看宝塔推荐Mysql 8.0需要有2G内存最好,可是我这辣鸡服务器总共内存才2G,所以不考虑8.0,更何况从最后的测试结果来看,我不相信换成8.0能弥补这个差距),全部采用安装时的默认配置,不做任何优化(因为我不会),这样也可以看数据库自身,最大众的情况下的调教能力(在找借口),两台都部署在上述那台服务器上

3.建表和字段:

字段

Mysql格式

PostgresQL格式

id(uuid)

char(36)

char(36)

gmt_create

datetime

timestamp without timezone

gmt_modified

datetime

timestamp without timezone

content

varchar(20)

text

在id,gmt_create,content分别加了单索引

说明一下,PostgresQL的text属性是可无限填数据的,Mysql用的的可变字符varchar(20),而不是longtext,应该已经算优待Mysql了吧

4.数据插入方法:

模拟真实脚本环境,采用springboot+spring-data-jpa 造假数据插入,jpa开启批量插入设置,并可控制batch大小,经过多次测试找出最适合数据库的batch size大小。

为了避免服务器/运行环境资源争抢,一次只运行单个数据库的数据插入方法,下面是批量插入核心代码

三:测试插入

Mysql:

经过测试,Mysql入库速度大约是每秒10条左右,所以batch大小我设置为了5。

设置100会导致8秒1插(一开始数据库数量很少的时候,后面多了肯定还是会降),设置1000会抛异常,连接超时/重置/未响应等异常,这里不是我不给它设置大的,一开始设置了1000它真的扛不住!!!

以下是插入的时候控制台信息:

以下是workbench里面筛选1分钟录入数据的值:

这是只有40多万数据的时候的值,后面会更慢的,实在是懒得等了先把这部分先写了,所以得出结论:

Mysql的写入速度为:510 / 60 = 8  条数据每秒

PostgresQL:

经过测试,PostgresQL入库速度大约为每秒不到1000条,所以batch大小我设置了500。

以下是插入的时候控制台信息:

以下是pgadmin里面筛选1分钟录入数据的值:

所以得出结论:

PostgresQL的写入速度为:  48000 / 60 = 800  条数据每秒

这差距也太大了。。。大到我都不想再测100W条数据后,查数据的速度了。。。

还是等吧,我等到Mysql龟速插完100W条数据以后再来更新吧

四:查询速度测试

由于Mysql在插入50W条数据以后写入性能急剧下降,并且不停报错,所以决定终止插入Mysql数据。

就以PostgresQL 100W条数据:

Mysql  57W条数据:

在此基础上测试

非常简单的测试场景:

Mysql:

PostgresQL:

解释一下:postgresql源生的btree索引,不支持中文检索,导致不论怎么检索(‘XXXX%’)它根本不生效,1111条数据返回时间仍为80000+,于是查了一下,装了个 pg_trg 组件支持中文索引,结果这个组件太强大了。。。'%XXXX%'也同样支持触发索引。

装组件的方法:

1.centOS服务器下载组件:

sudo yum install postgresql11-contrib

2.在pgadmin,或者pgsql里面执行(就类似于执行sql那样)

CREATE EXTENSION pg_trgm;

五:一些总结

一开始测试Mysql的插入的时候,我一度怀疑是我安装Mysql的时候配置出错了?怎么可能这么低!!!

后来测试读取的时候速度正常,比PostgresQL低的没有写入那么大,才让我觉得,嗷,原来是PostgresQL厉害。。。

我的本次测试只能说基于我这台服务器的情况,并且是模拟我的使用场景(springboot + spring data jpa),可能并没有普适性。或许Mysql通过sql脚本导入快得多,但那不是我的使用场景没有办法,不公平就不公平吧,我也没有办法。

我也欢迎大家提出对Mysql和PostgresQL优化的意见,经过调优之后再做对比。

我相信在高性能服务器上,测试结果(尤其是写入),可能Mysql的差距会减小,但这是我个人学习用的服务器,我买不起超高配置的,就只能这样了,如果Mysql只能有这样的性能表现,那我只能向Mysql说拜拜了。。。

mysql 速度评测_[评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)...相关推荐

  1. ubuntu mysql 修改 端口_在Ubuntu/Linux环境下使用MySQL:开放/修改3306端口、开放访问权限...

    操作系统:Ubuntu 17.04 64位 MySQL版本:MySQL 5.7 一.查看3306端口是否开放 netstat -an|grep 3306 如果看到下图这样的,说明端口并未打开: 二.修 ...

  2. linux 下升级apache,CentOS6.5在已有低版本环境下安装升级Apache+MySQL+PHP,centos6.5apache...

    CentOS6.5在已有低版本环境下安装升级Apache+MySQL+PHP,centos6.5apache 由于最近工作中遇到了一个在比较老旧RedHat系Linux发行版系统上升级安装Apache ...

  3. 中科院刘康:低资源环境下的事件知识抽取

    不到现场,照样看最干货的学术报告! 嗨,大家好.这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频--足 ...

  4. MYSQL 5.7 解压版 windows 环境下安装

    MYSQL 5.7 解压版 windows 环境下安装 1.下载MYSQL 2.下载完成后,放入要部署目录,解压. 3.新建 my.ini 文件 data 子文件夹千万不要自己建,否则后续启动会报错 ...

  5. Oracle+ASM单机环境下,开启归档的最简单的方法

    在ASM单机环境下,开启归档的最简单的方法. 环境:oracle11g  11.2.0.4 登陆sqlplus [oracle@udevasm ~]$ sqlplus / as sysdba SQL* ...

  6. syft要求低配环境 v.s. 硬件要求高配环境:报错全记录

    因为需要syft这个包,而显卡比较好,e.g., A100,有一些python.pytorch.cuda.cudnn版本不兼容的矛盾. 默认已有conda环境.因为要用A100所以CUDA必须> ...

  7. mysql集群session_集群/分布式环境下5种session处理策略

    前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理.如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A.B两台服务器,用户在第一次访问网站时,Ngin ...

  8. mysql日志输出到syslog_在chroot环境下将MySQL日志输出到syslog

    好久没写博客了,这几个月一直在学习nodejs,angularjs,做一些前端开发,目前还是学习阶段,等有一些体会再来分享. 这两天碰到的一个问题是,我们的产品给客户后,客户要统一管理日志,MySQL ...

  9. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  10. mysql jail_2.1.5 jail在生产环境下的注意事项

    2.1.5 jail在生产环境下的注意事项 我们将jail用在线上的生产环境,发现其中有许多需要注意的事项,如下所示: 1)线上的服务器用的jail机器还是挺多的,通常一台Dell PowerEdge ...

最新文章

  1. python使用np.linspace函数生成均匀的浮点数列表实战:生成浮点数列表、生成浮点数列表(指定是否包含末尾值)
  2. [软件架构:设计模式系列C#篇]系列教程汇总
  3. windows下mongodb的安装与配置
  4. 外部编辑Infopath的表单模板(xsn)
  5. 【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
  6. linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法
  7. 分享几个你可能不知道的交互式Git 命令
  8. Java中JTextField.getText() 和 JPassword.getPassword() 的区别
  9. mysql 5.1 1067,mysql服务1067错误多种解决方案汇总
  10. [NOI2003]Editor [AHOI2006]文本编辑器editor BZOJ1507BZOJ1269
  11. Tech Insight携阿里云Link物联网平台助力实现“IoT全栈开发”
  12. 三宝机器人怎么充电_三宝机器人说明书
  13. U3D游戏开发框架(三)——UI管理器
  14. 聊聊精密测量仪器的气源维护知识
  15. LTE小区搜索过程及SCH/BCH设计
  16. nimg 文件服务器 部署,RHEL6.5 部署DNS服务器
  17. python io模块
  18. python 类 子类 初始化 super
  19. Flutter 多子 Widget 布之Stack、Positioned
  20. RHCE for RHEL6認證考試簡介

热门文章

  1. maya python window_安装了Anaconda之后,Maya运行报错,Python 找不到 Maya 的 Python 模块...
  2. word文档图标变成白纸_win10word文档图标变白,win10office图标空白
  3. Win10找回自带的Windows照片查看器:打开jpg、png、gif格式的图片
  4. 认识BLE 5协议栈 —— 直接测试模式
  5. 计算机专业论文推荐,计算机专业论文参考文献推荐
  6. 系统U盘还原成普通U盘
  7. PHP项目汇报ppt模板,免费工作汇报模板(课堂PPT)
  8. NSX-T业务转发04—— 多层Tier0Tier1路由
  9. 硅谷华人码农成语大全
  10. vc707 MicroBlaze Helloworld 实验