• [评测]低配环境下,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说拜拜了。。。

  • 相关阅读:
    Caused by: org.xml.sax.SAXParseException; lineNumber: 29; columnNumber: 107; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mucp.QRTZ_TRIGGERS' doesn't exist
    ava.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号
    activitemq启动时出现 ERROR: java.lang.RuntimeException: Failed to execute start task. Reason: java.lang.IllegalStateException: BeanFactory
    sql 替换
    tomcat 点击startup.bat会闪退
    java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
    运行rviz出现以下问题
    rosplan ---AI planning
    ros 地图.pgm文件编辑
  • 原文地址:https://www.cnblogs.com/blog5277/p/10658426.html
Copyright © 2020-2023  润新知