zoukankan      html  css  js  c++  java
  • [评测]低配环境下,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说拜拜了。。。

  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/blog5277/p/10658426.html
Copyright © 2011-2022 走看看