golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比
阅读使人充实,讨论使人敏捷,写作使人精确。
>>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例。至于题目涉及的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压测性能对比相关推荐
- 压测 mysql关闭连接_MySQL 压测
https://mp.weixin.qq.com/s/vKJZp5cGUetHokGh2EZUXg mysqlslap --iterations=100 --create-schema='test' ...
- linux 5432端口,无法连接到端口5432上的postgresql
问题描述 我安装了包含PostgreSQL 8.4的Bitnami Django stack. 当我运行psql -U postgres时,我收到以下错误: psql: could not conne ...
- golang 接口_「实战」助力数据库开发之接口篇 - Golang 连接 Greenplum
Greenplum 作为一款强大的 HTAP 数据库,针对大多数流行语言都有相应的连接库.大部分均是与 PostgreSQL 采用相同的接口,但是也有部分接口是 Greenplum 专门优化后用于自身 ...
- php postgresql多条,PHP操作Postgresql封装类与应用完整实例
本文实例讲述了PHP操作Postgresql封装类与应用.分享给大家供大家参考,具体如下: 这个类封装了一些常用的函数,原帖里面还有事务处理的内容,以后再学习吧. 类文件定义: class pgsql ...
- 荐书送书丨《PostgreSQL实战》、《PostgreSQL修炼之道:从小工到专家(第2版)》...
墨墨导读:最近,相信大家都注意到数据库行业大事记,PostgreSQL在2020年的DB-Engines 排名中获得了比其他360个受监控数据库系统更多的受欢迎程度,获得"2020年度数据库 ...
- Postgresql快照优化Globalvis新体系分析(性能大幅增强)
相关: <Postgresql源码(18)PGPROC相关结构> <Postgresql源码(65)新快照体系Globalvis工作原理分析> <Postgresql快照 ...
- 流计算风云再起 - PostgreSQL携PipelineDB力挺IoT(物联网), 大幅提升性能和开发效率...
标签 PostgreSQL , pipelinedb , 流计算 , patch , bug , libcheck , zeromq , kafka , kinesis , IoT , 物联网 背景 ...
- postgresql入门_PostgreSQL教程:PostgreSQL 10入门
postgresql入门 多年来,PostgreSQL一直是企业软件和开放源代码中保存最好的秘密之一-功能强大,健壮且经过专家维护的关系数据库. MySQL可能更广为人知,但PostgreSQL提供了 ...
- 拥抱开源,聆听不同的声音——2017 PostgreSQL大象汇暨第八届PostgreSQL中国技术大会行记...
活动介绍: 2017年10月21日,PostgreSQL 2017中国技术大会于深圳科兴科学园国际会议中心圆满收官. "PostgreSQL大象汇"是由PostgreSQL中国用户 ...
最新文章
- pandas常用函数说明及速查表
- 新手入门深度学习 | 2-1:图像数据建模流程示例
- 笔记-项目整体管理-开工会议-kick-off-meeting
- arm-linux-gcc 4.7.4 源码编译 手工制作
- 五步法颈椎病自我按摩图解
- 用python绘制一条直线_python绘制直线的方法
- 请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。
- zabbix中常用到的几个key:
- win 7 或 mac 远程桌面到 ubuntu (ssh)
- ffmpeg 推流同时录像命令_ffmpeg推流命令
- redis zset转set 反序列化失败_7000字 Redis 超详细总结、笔记!建议收藏
- vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
- Java核心技术11 | Java IO
- 平面设计常见的配色方案及色标
- Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放
- dockers安装Jenkins
- 12星座的出生年月日性格_十二个星座的出生年月日
- [笔试] 查找兄弟单词(2012/5/6 百度实习笔试题)
- android 4.0 安全模式分析
- sort、asort、ksort 三者说明
热门文章
- asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...
- Linux基础系列(四)系统用户和组管理
- Input.GetAxis
- 使用DRS的维护模式实现单个VM的测试
- java中什么时候不能用泛型_java中泛型的正确使用姿势
- python逻辑型数据也叫什么_Python的数据类型与数据结构
- flex布局常用属性
- tga文件怎么打开_六安软件定制文件打开的时候乱码怎么解决?
- 在layui中使用ajax传值给后台,解决layui批量传值到后台操作时出现传值为空的问题...
- 福昕pdf编辑器 android,机PDF编辑器安卓/iOS哪家强?职场达人都在用