[评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)
[评测]低配环境下,PostgresQL和Mysql读写性能简单对比
原文链接: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说拜拜了。。。
[评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)的更多相关文章
- 中文环境下PostgreSQL的使用
虽然官方文档有提到编码的问题,但是对于中文讲的比较简单,给中文的PostgreSQL用户带来很多困扰,本文简单简述一下中文环境下PostgreSQL如何正确设置编码. 一.服务器端的编码设置 Post ...
- Core1.1环境下,自己实现的一个简单的CRUD框架(反射实现)
我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...
- Linux环境下实现对文件读写操作
---- 今天分享一下在linux系统在实现对文件读写一些基本的操作,在这之前我们要掌握一些基本的技能在Linux环境下.比如查看命令和一个函数的具体用法,就是相当于查手册,在Linux下有一个man ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变
[Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...
- 分享一个低配VPS下运行的mysql配置文件
在各种内存CPU核心只有1/2核,内存只有512M/1G的vps下,内存.CPU.硬盘都不是太充裕.因此主要思路是,禁止吃内存大户innodb引擎,默认使用MyISAM.禁止吃硬盘大户log-bin, ...
- windows环境下PostgreSQL的安装
1.首先在如下链接下载PostgreSQL的压缩包,我这里下载的是postgresql-12.1-1-windows-x64-binaries.zip. https://www.enterprised ...
- window环境下,php+sphinx+coreseek实现简单的中文全文搜索
就以我个人理解来说,sphinx其实是介于客户端和mysql之间的一个索引表,把数据库的没一条记录假设为文档,那么这个索引表其实保存的就是这条记录的关键词及其对应的文档id 1.sphinx的安装 下 ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- myEclipse环境下配置springMvc项目,进行简单的请求
1."File-->New-->WebProject"新建一个web项目,命名为springMvc 2.将所需要用到的jar包复制到WEB-INF/lib路径下,然后右 ...
随机推荐
- Oracle数据库自带表或者视图
dba_开头 dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息 dba_tablespaces 数据库 ...
- Python3.0科学计算学习之绘图(二)
(1) np.mashgrid()函数:-----生成网络点坐标矩阵,可以是二维网络矩阵,也可以是三维网络矩阵.其中,每个交叉点就是网络点,描述这些网络点的矩阵就是坐标矩阵(横坐标矩阵X中的每个元素与 ...
- 团队项目第一篇——NABCD
团队名称: 团队项目名称: 团队口号: N(Need)需求: 现如今数据越来越零碎化,繁杂化,身为在校大学生的我们也因此对于时间的利用率也相应减少,为了时间的充分利用,减少在冗杂的信息中耽误的时间,充 ...
- 如何通过轮询实现session自动注销
每个用户在访问完网站后,经常会忽略注销账户,session默认存在的时间为30分钟,因此如果需要立即关闭session而又不用麻烦用户则可以通过轮询的方法来实现. 以下通过代码的讲解: xml配置文件 ...
- Java基础(运算符)
Java中的运算符: 算术运算符:+ - * / % ++ -- %运算符叫取模:它就是取余的例如:43%7=1 其他的都是和数学里的运算符一样(不过在字符串中如果是两个字符串 ...
- windows程序设计 获取磁盘容量
//磁盘分区的总容量(字节)=总簇数*每簇扇区数*每扇区字节数 //磁盘分区的空闲空间(字节)=空闲簇数*每簇扇区数*每扇区字节数 BOOL GetDiskFreeSpace( LPCTSTR lpR ...
- 删除打开方式里的wine
title: "删除打开方式里的wine" date: 2018-05-27T13:54:28+08:00 tags: ["wine"] categories: ...
- 【论文速读】Fangfang Wang_CVPR2018_Geometry-Aware Scene Text Detection With Instance Transformation Network
Han Hu--[ICCV2017]WordSup_Exploiting Word Annotations for Character based Text Detection 作者和代码 caffe ...
- C# 实现http不同方法的请求
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- c# 笔记cookie
if (Request.Cookies["svpoint"] != null) { Request.Cookies[].s_SvcID.ToString(); } else { H ...