阅读使人充实,讨论使人敏捷,写作使人精确。

>>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例。至于题目涉及的MySQL和PostgreSQL之间的关系,主要为业务选型积累基础参考,并非为了抬高谁、贬低谁,其实很多情况,两者皆可。期盼国内MySQL和PostgreSQL可以互相借鉴、吸收。本次压测的主要功能点为业务实时关注社区动态以下4点:1.最新发表动态;2.动态最新评论;3.社区话题精华;4.社区话题等动态列表置顶。

温馨提示:文章压测结果仅供参考,不代表官方性能测试结论。 

>>> 压测环境介绍

业务场景 OLTP系统,单表简单SQL增删改查
数据量 随机读85w,随机写从85w到20亿。
系统架构 分布式单节点(64分片)一主二从强同步
机型配置

1.CN节点:32C-64G

2.DN节点:32C-64G-4*1.8T NVMe SSD做raid0

连接方式 client长连接,MySQL线程池,PostgreSQL连接池
业务超时设置 200ms

>>> 环境内部配置1.MySQL使用TDSQL(基于MySQL-5.7.17),开启并行复制

1)基于LOGICAL_CLOCK,64个线程并行复制;2) group commit使用COMMIT_ORDER;3) master_info_repository=TABLE,relay_log_info_repository=TABLE。4) 设置不可退化强同步(至少一个同城slave同步,否则master挂起)。5) 主从刷盘双“1”配置。

2.PostgreSQL使用Tbase-v2(基于PostgreSQL-10.5),采用PGXL1)cn节点pooler配置

postgres=# show pooler_scale_factor; pooler_scale_factor --------------------- 16(1 row)postgres=# show persistent_datanode_connections; persistent_datanode_connections --------------------------------- on(1 row)postgres=# 

2)dn节点

pooler_scale_factor = 16

3)主从同步同城any one强同步,主库配置

postgres=# show synchronous_commit; synchronous_commit -------------------- on(1 row)postgres=# show synchronous_standby_names; synchronous_standby_names  ---------------------------- ANY 1 (100.xx.xxx.52:5436)(1 row)postgres=#

>>> 表结构及压测SQL文本注:本文表结构及索引设计已经多次调优整改,剩余优化空间较小。1.MySQL表结构:shardkey=test_id

"tab_target | CREATE TABLE `tab_target` (  `test_id` bigint(20) NOT NULL,  `moment_id` bigint(20) NOT NULL,  `creator` bigint(20) NOT NULL,  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  `comment_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  `complex_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  `status` smallint(5) unsigned NOT NULL DEFAULT '0',  `is_essence` smallint(5) unsigned NOT NULL DEFAULT '0',  `set_essence_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  `is_top` smallint(5) unsigned NOT NULL DEFAULT '0',  `set_top_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  `visible_range` smallint(5) unsigned NOT NULL DEFAULT '0',  `is_hide` smallint(5) unsigned NOT NULL DEFAULT '0',  `set_hide_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  PRIMARY KEY (`test_id`,`moment_id`),  KEY `idx_comp02` (`test_id`,`status`,`visible_range`,`is_hide`,`is_essence`),  KEY `idx_comp03` (`test_id`,`status`,`visible_range`,`is_hide`,`is_essence`,`moment_id`,`creator`,`create_time`,`comment_time`,`complex_time`),  KEY `idx_comp01` (`test_id`,`create_time`,`moment_id`),  KEY `idx_comp04` (`test_id`,`is_essence`,`status`,`is_hide`,`create_time`,`moment_id`),  KEY `idx_comp05` (`test_id`,`is_top`,`moment_id`),  KEY `idx_comp06` (`test_id`,`complex_time`,`moment_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 shardkey=test_id "

‍2.PG表结构:Distribute By: SHARD(test_id)

akendb=# \d+ tab_target                                                      Table ""public.tab_target""      Column      |           Type           | Collation | Nullable |               Default               | Storage | Stats target | Description ------------------+--------------------------+-----------+----------+-------------------------------------+---------+--------------+------------- test_id     | bigint                   |           | not null |                                     | plain   |              |  moment_id        | bigint                   |           | not null |                                     | plain   |              |  creator          | bigint                   |           | not null |                                     | plain   |              |  create_time      | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              |  comment_time     | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              |  complex_time     | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              |  status           | smallint                 |           |          | 0                                   | plain   |              |  is_essence       | smallint                 |           |          | 0                                   | plain   |              |  set_essence_time | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              |  is_top           | smallint                 |           |          | 0                                   | plain   |              |  set_top_time     | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              |  visible_range    | smallint                 |           |          | 0                                   | plain   |              |  is_hide          | smallint                 |           |          | 0                                   | plain   |              |  set_hide_time    | timestamp with time zone |           |          | to_timestamp((0)::double precision) | plain   |              | Indexes:    ""tab_target_unique_constraint"" UNIQUE CONSTRAINT, btree (test_id, moment_id)    ""tab_target_test_id_create_time_moment_id_idx"" btree (test_id, create_time, moment_id) WHERE status = 0 AND visible_range <> 200 AND is_hide = 0 AND is_essence = 1    ""tab_target_test_id_create_time_moment_id_idx1"" btree (test_id, create_time, moment_id) WHERE test_id = 239 AND status = 0 AND visible_range <> 200 AND is_hide = 0    ""tab_target_test_id_set_top_time_idx"" btree (test_id, set_top_time) WHERE status = 0 AND visible_range <> 200 AND is_hide = 0 AND is_top = 1    ""condit_complex_idx"" btree (test_id, complex_time, moment_id) WHERE status = 0 AND visible_range <> 200 AND is_hide = 0    ""idx_comp"" btree (test_id, status, visible_range, is_hide)Distribute By: SHARD(test_id)Location Nodes: dn001akendb=#

3.核心功能点SQL语句1)MySQL语句:

--置顶列表:SELECT moment_id FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_top = 1 AND is_hide = 0 order by set_top_time desc LIMIT 1000;--最新发布:SELECT moment_id,creator,UNIX_TIMESTAMP(create_time) as create_time_1,UNIX_TIMESTAMP(comment_time) as comment_time_1,UNIX_TIMESTAMP(complex_time) as complex_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 order by create_time desc, moment_id desc limit 1000;--最新评论:SELECT moment_id,creator,UNIX_TIMESTAMP(create_time) as create_time_1,UNIX_TIMESTAMP(comment_time) as comment_time_1,UNIX_TIMESTAMP(complex_time) as complex_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 order by complex_time desc, moment_id desc limit 1000;--只看精华:SELECT moment_id,creator,UNIX_TIMESTAMP(create_time) as create_time_1,UNIX_TIMESTAMP(comment_time) as comment_time_1,UNIX_TIMESTAMP(complex_time) as complex_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 AND is_essence = 1 order by create_time desc, moment_id desc limit 1000;

2)PostgreSQL语句:

--置顶列表:SELECT moment_id FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_top = 1 AND is_hide = 0 order by set_top_time desc LIMIT 1000;--最新发布:SELECT moment_id,creator,(date_part('epoch', create_time))::bigint as create_time_1,(date_part('epoch', comment_time))::bigint as create_time_1,(date_part('epoch', complex_time))::bigint as create_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 order by create_time desc, moment_id desc limit 1000;--最新评论:SELECT moment_id,creator,(date_part('epoch', create_time))::bigint as create_time_1,(date_part('epoch', comment_time))::bigint as create_time_1,(date_part('epoch', complex_time))::bigint as create_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 order by complex_time desc, moment_id desc limit 1000;  --只看精华:SELECT moment_id,creator,(date_part('epoch', create_time))::bigint as create_time_1,(date_part('epoch', comment_time))::bigint as create_time_1,(date_part('epoch', complex_time))::bigint as create_time_1 FROM tab_target WHERE test_id = 239 AND status = 0 AND visible_range != 200 AND is_hide = 0 AND is_essence = 1 order by create_time desc, moment_id desc limit 1000;

>>> 读请求压测结果

1.单次读性能对比

1)数据量85w

2)数据量:2.7亿(64分片)

2.并发读性能对比:1)数据量:85w

2)数据量:2.7亿(64分片)

注:单分片数据量达到4千万以上,理论上增加分片的情况下,MySQL的性能应该还会有所提升。>>> 写请求压测结果1.随机写配置:

--MySQL语句样例REPLACE INTO tab_target(test_id, moment_id, creator, create_time, complex_time, status, is_essence, set_essence_time, is_top, set_top_time, is_hide, set_hide_time, visible_range) VALUES(239, 652763263, 1286241, '2020-10-12 11:11:21', '2020-10-12 11:11:21', 1, 0, '2020-10-12 11:11:21', 1, '2020-10-12 11:11:21', 1, '2020-10-12 11:11:21', 0);--PostgreSQL语句样例INSERT INTO tab_target(test_id, moment_id, creator, create_time, complex_time, status, is_essence, set_essence_time, is_top, set_top_time, is_hide, set_hide_time, visible_range) VALUES(239, 861227078, 8223700, '2020-09-29 17:33:29', '2020-09-29 17:33:29', 1, 0, '2020-09-29 17:33:29', 0, '2020-09-29 17:33:29', 1, '2020-09-29 17:33:29', 0) ON CONFLICT ON CONSTRAINT tab_target_unique_constraint DO UPDATE SET status=1, is_essence=0, set_essence_time='2020-09-29 17:33:29', is_top=0, set_top_time='2020-09-29 17:33:29', is_hide=1, set_hide_time='2020-09-29 17:33:29', visible_range=0, create_time='2020-09-29 17:33:29', complex_time='2020-09-29 17:33:29'"

2.单次写性能对比:

3.并发写性能对比:

>>> 压测结论1.读请求总结1)上述语句单次读请求,部分语句在MySQL的表现稍微优于PostgreSQL,并发较低的简单查询业务场景,两者整体相差不大。2)上述语句并发读请求,MySQL接入机比pg分布式cn消耗更小的CPU资源,但整体的QPS能力及稳定性PostgreSQL较高。3)补充一下,MySQL在字段函数计算上内核态会消耗更多CPU,上述语句中UNIX_TIMESTAMP函数需剥离到客户端或业务逻辑实现,否则200并发可将整个服务器CPU耗完。2.写请求总结1)上述语句单次随机写,MySQL比PostgreSQL要好,主要原因在于两者之间的强同步方式有所区别,说明pg强同步对写入性能有较大影响。2)上述语句并发写,PostgreSQL同步保障在毫秒级,MySQL无论是同步方式还是异步方式,单节点TPS>8000时有明显同步延迟。

温馨提示:文章压测结果仅供参考,不代表官方性能测试结论。 

往期推荐

1.MySQL-用最简单实用的方法将SQL性能提升100倍

2.MySQL日常运营重要事项存在问题总结

3.PostgreSQL数据库TPCC测试-Banchmarksql 5.0部署详解

                                 ——让学习成为一种习惯-Aken

感谢阅读

golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比相关推荐

  1. 压测 mysql关闭连接_MySQL 压测

    https://mp.weixin.qq.com/s/vKJZp5cGUetHokGh2EZUXg mysqlslap --iterations=100 --create-schema='test' ...

  2. linux 5432端口,无法连接到端口5432上的postgresql

    问题描述 我安装了包含PostgreSQL 8.4的Bitnami Django stack. 当我运行psql -U postgres时,我收到以下错误: psql: could not conne ...

  3. golang 接口_「实战」助力数据库开发之接口篇 - Golang 连接 Greenplum

    Greenplum 作为一款强大的 HTAP 数据库,针对大多数流行语言都有相应的连接库.大部分均是与 PostgreSQL 采用相同的接口,但是也有部分接口是 Greenplum 专门优化后用于自身 ...

  4. php postgresql多条,PHP操作Postgresql封装类与应用完整实例

    本文实例讲述了PHP操作Postgresql封装类与应用.分享给大家供大家参考,具体如下: 这个类封装了一些常用的函数,原帖里面还有事务处理的内容,以后再学习吧. 类文件定义: class pgsql ...

  5. 荐书送书丨《PostgreSQL实战》、《PostgreSQL修炼之道:从小工到专家(第2版)》...

    墨墨导读:最近,相信大家都注意到数据库行业大事记,PostgreSQL在2020年的DB-Engines 排名中获得了比其他360个受监控数据库系统更多的受欢迎程度,获得"2020年度数据库 ...

  6. Postgresql快照优化Globalvis新体系分析(性能大幅增强)

    相关: <Postgresql源码(18)PGPROC相关结构> <Postgresql源码(65)新快照体系Globalvis工作原理分析> <Postgresql快照 ...

  7. 流计算风云再起 - PostgreSQL携PipelineDB力挺IoT(物联网), 大幅提升性能和开发效率...

    标签 PostgreSQL , pipelinedb , 流计算 , patch , bug , libcheck , zeromq , kafka , kinesis , IoT , 物联网 背景 ...

  8. postgresql入门_PostgreSQL教程:PostgreSQL 10入门

    postgresql入门 多年来,PostgreSQL一直是企业软件和开放源代码中保存最好的秘密之一-功能强大,健壮且经过专家维护的关系数据库. MySQL可能更广为人知,但PostgreSQL提供了 ...

  9. 拥抱开源,聆听不同的声音——2017 PostgreSQL大象汇暨第八届PostgreSQL中国技术大会行记...

    活动介绍: 2017年10月21日,PostgreSQL 2017中国技术大会于深圳科兴科学园国际会议中心圆满收官. "PostgreSQL大象汇"是由PostgreSQL中国用户 ...

最新文章

  1. pandas常用函数说明及速查表
  2. 新手入门深度学习 | 2-1:图像数据建模流程示例
  3. 笔记-项目整体管理-开工会议-kick-off-meeting
  4. arm-linux-gcc 4.7.4 源码编译 手工制作
  5. 五步法颈椎病自我按摩图解
  6. 用python绘制一条直线_python绘制直线的方法
  7. 请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。
  8. zabbix中常用到的几个key:
  9. win 7 或 mac 远程桌面到 ubuntu (ssh)
  10. ffmpeg 推流同时录像命令_ffmpeg推流命令
  11. redis zset转set 反序列化失败_7000字 Redis 超详细总结、笔记!建议收藏
  12. vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
  13. Java核心技术11 | Java IO
  14. 平面设计常见的配色方案及色标
  15. Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放
  16. dockers安装Jenkins
  17. 12星座的出生年月日性格_十二个星座的出生年月日
  18. [笔试] 查找兄弟单词(2012/5/6 百度实习笔试题)
  19. android 4.0 安全模式分析
  20. sort、asort、ksort 三者说明

热门文章

  1. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...
  2. Linux基础系列(四)系统用户和组管理
  3. Input.GetAxis
  4. 使用DRS的维护模式实现单个VM的测试
  5. java中什么时候不能用泛型_java中泛型的正确使用姿势
  6. python逻辑型数据也叫什么_Python的数据类型与数据结构
  7. flex布局常用属性
  8. tga文件怎么打开_六安软件定制文件打开的时候乱码怎么解决?
  9. 在layui中使用ajax传值给后台,解决layui批量传值到后台操作时出现传值为空的问题...
  10. 福昕pdf编辑器 android,机PDF编辑器安卓/iOS哪家强?职场达人都在用