某业务部门的同事们,生成一亿条数据写入 mysql 数据库,花了好几个小时。
我告诉他 pg 一秒可以写十几万条,并拿出压测数据的时候,他们纷纷表示非常震惊。 这几位程序员,运维的都是工作好些年的,但之前都没听过 pg。
另外一个部门每天要把几亿条数据从 oracle 库用 navcat 搬到 mysql 库(恩,他们也没听过 pg,把最后的 mysql 库作为结果查询库),然后每天要跑 7 个小时。 听说我们大数据很快,就过来问我们怎么加快速度。乱七八糟的叹了一下午,他们想法很多,最后说要加快速度你可以装个 pg 试试。
然后他们在原来的 mysql 集群上,装了个 pg 的主备。在 oracle 生成了几亿条数据。然后分别跑了测试。 mysql 的速度和上面差不多, 但是 pg 呢,开了 10 个并行,原话如下: “ pg 的 copyin 方式,432 秒拷贝 3.68 亿条记录,cpu 最高 62%,磁盘写 io 最高 100MB/s,网络带宽最高 670Mbps。另外,磁盘占用比 mysql 少多了(大概少 50GB )。”
估计现在他们也会感觉和 pg 相逢恨晚了。
1
congeec 2017-11-21 11:14:48 +08:00
各有优势啊
还是来个 benchmark 比较实在 |
2
gouchaoer 2017-11-21 11:16:51 +08:00 1
二者实现原理上差别不大,性能差别不大,压测: http://blog.csdn.net/liyuming0000/article/details/51240798
|
3
whx20202 2017-11-21 11:26:46 +08:00 2
只有我对 pg 不感冒吗
我之前用的 mysql 用的很爽。 pg 是堆表,不按照主键排序,mysql 的 innodb 是索引组织表,虽然说是各有利弊 实际使用上我用 mysql 更舒服一点 postgresql 那些什么多数据源,gist gin hash 索引我也用不到,还得担心 pg 的多版本并发控制带来的表膨胀 另外 pg 进程模型,写日志却是单进程,连接数很大的时候,慢 SQL 进程争抢管道导致 系统 high load,进而更多的 SQL 变成慢 SQL 需要打日志,然后滚雪球了。。 个人偏好还是 mysql |
4
dawncold 2017-11-21 11:27:31 +08:00
pg 性能并不一定最好,但绝对不会成为你的瓶颈,而且语法异常亲民!
|
5
jy01264313 2017-11-21 11:27:33 +08:00
MySQL 你用的是默认配置吧
|
6
7654 2017-11-21 11:30:44 +08:00
有 oracle 为什么还要上面的 mysql 和 pg
|
7
whx20202 2017-11-21 11:34:45 +08:00
对了,如果真想搞事情,oracle 也是个好选择,是不是最先进的不好说,起码功能很强大
|
8
est 2017-11-21 11:45:28 +08:00 6
MySQL 你是用 默认配置吧 +1
关索引,关事物,调 innodb 缓存,用 csv 秒灌。 pg 为什么当年玩不过 MySQL ?性能不行。 MySQL 8 的性能太诱人了。实在没法喜欢 pg。 |
9
NeinChn 2017-11-21 11:49:26 +08:00
非常好奇什么叫做用 navcat 搬到 mysql 库.....
|
10
az8321550924 2017-11-21 11:57:11 +08:00
MySQL 8 来了
|
11
yangqi 2017-11-21 11:59:03 +08:00
这么明显的软文,呵呵
|
12
cstj0505 OP @jy01264313 第一个部门的 mysql 是阿里云的 RDS,8 核 16G。
第二个他们自己的业务系统的 mysql,具体配置我不清楚,不过 pg 也是在哪 2 个服务器上 |
13
cstj0505 OP @whx20202 oracle 当然是个很好的选择,数据源就是 oracle,不过这个试分析系统,不是业务系统,所以采用的开源数据库
|
14
cstj0505 OP @gouchaoer 你这个压测里面都是 insert,你试试 jdbc 的 copyin,这个就是 copyin 跑出来的
|
17
cstj0505 OP @7654 oracle 是业务库,分析库估计不想买 license 了吧。不过不是一个部门,具体的原因我也不清楚。
|
18
yangqi 2017-11-21 12:37:27 +08:00
@cstj0505 呵呵,你会用 mysql 么。按照你的体验如果 pg 真比 mysql 强那么多倍,那么多年都比不过 mysql, 你以为大家都是傻子,有好的不用?不是软文就是你真的不懂
|
19
ren2881971 2017-11-21 12:39:15 +08:00
用 oracle 的瑟瑟发抖。。。
|
20
doubleflower 2017-11-21 12:42:21 +08:00
这算是黑 pg 吗,和 mysql 比什么也不要比性能...
|
21
panpanpan 2017-11-21 12:43:52 +08:00
我看到用'''navcat 搬到 mysql 库'''...我就感觉是不是你们的方式不太对
|
23
caotian 2017-11-21 12:51:18 +08:00
呃,工作几年的开发不知道 pg, 有情可原, 运维也不知道?
|
24
cstj0505 OP @yangqi 懒得泼妇骂街,就问问你啊,几亿条数据,怎么搞到 mysql 里面去,要花多久。
你有好方案我和同事说了告诉他们去 |
25
cstj0505 OP @doubleflower 这有什么不能比的,可能某些事物场景下 mysql 有优势,但是大数据量下的并行查询,copyin 的数据写入不是性能吗
|
26
realpg 2017-11-21 13:39:40 +08:00 via Android
没过 GRE 不敢用
|
27
glues 2017-11-21 13:48:43 +08:00
PG 现是在公认的最好的开源数据库,MySQL 自从被 Oracle 收购后几乎没啥进步了。
楼上的那些无脑黑估计这辈子只用过单机 MySQL 吧,所以对他们来说用什么数据库是无所谓的 |
28
stabc 2017-11-21 13:52:12 +08:00
虽然数据库的选择方面我也站 PG,但是真要和 MYSQL 对比的话,最好还是公平点,严格点吧。我看你写的内容,无法确定对比的公平性。
|
29
cstj0505 OP @stabc 这个确实不是严格的压测,现在他们第一个最大的问题就是把几亿条数据从 oracle 搬到 mysql。mysql 他们去年就开始在客户那边用了,你要说他们会做有多少优化我不知道,但我觉得给几十个客户用了再生产上肯定不会是默认配置吧。还有另一个部门用的阿里云的 RDS8 核 16G。这个项目上几百个 mysql 实例了。
但是就 pg 这样的写入速度,他们在 mysql 上应该是没见过。 描述里面第二个场景服务器资源完全一样,因为在同样两台机器上分别做的测试。 |
30
glues 2017-11-21 14:02:11 +08:00 1
肯定又有人说为什么阿里腾讯都用 MySQL,其实他们已经在大规模用了
阿里双十一秒杀背后的技术 https://yq.aliyun.com/articles/64351 微信支付商户系统中运行近 3 年,管理超过 230 个节点和 400T 的数据量,也是全球最大的 PostgreSQL 集群之一 https://www.qcloud.com/community/article/465912 |
31
keymao 2017-11-21 14:03:41 +08:00
不要用 navicat 导出导入脚本。 mysqldump 导出最佳,max_allowed_packet 调大些。
至于 PG, 没用过,不评价。MySQL 的话优点,emmm 免费, 然后? 你问我然后? 没了。 |
32
stabc 2017-11-21 14:08:47 +08:00
@cstj0505 影响数据写入速度的因素很多,CPU 和内存速度,单个条目数据大小,数据关联程度等。超大量写入的话还要加上硬盘速度。我的建议还是要同样条件的公平对比。
|
33
mazyi 2017-11-21 14:12:47 +08:00 via iPhone
不就导个几亿条数据嘛,工具不会用倒是怪起了数据库?
|
34
Pastsong 2017-11-21 14:16:26 +08:00
MariaDB 呢?
|
35
cstj0505 OP @stabc 就是同样的条件。就两台机器,同时装了 mysql 和 pg 的主备。起 mysql 的时候 pg 停掉,pg 的数据清掉。起 pg 的时候 mysql 停掉,mysql 的数据清掉。
数据源都是同样几张来自 oracle 的数据表。 |
37
yushiro 2017-11-21 14:28:40 +08:00 via iPhone
@cstj0505 同一数据库的不同导入方式,性能会有巨大差异。以前用 insert 往 mssql 插入数据,那么叫慢啊,后来换用 mssql 的命令行 bcp 导数据,速度快了好几个数量级。
|
39
liprais 2017-11-21 14:33:36 +08:00
大部分工程师连 sql 都不会写,觉得数据库 = mysql ,说这些他们听不懂的
|
40
cstj0505 OP @yushiro insert 确实不会太快,不过我本地 pg ( i76700hq,16g,256SSD )当时开了 4 个线程 insert 到了 7 万 /s.同等情况下 mysql 只有 2 万。
用 pg jdbc 的 copyin 更夸张,13w 行 /s. |
41
sunchen 2017-11-21 14:40:18 +08:00 1
不了解 postgres 的人可以看看这个博客 https://github.com/digoal/blog, 你就会对 postgres 有相见恨晚的感觉了
|
42
wsy2220 2017-11-21 14:40:27 +08:00
搞数据库的不知道 pg?
|
43
tyfulcrum 2017-11-21 14:40:42 +08:00
流行程度和好不好没关系,别拿这个来给 MySQL 背书。worse is better。
|
44
torbrowserbridge 2017-11-21 14:42:35 +08:00 via Android
没听过 pg,鬼才信
|
45
tabris17 2017-11-21 14:42:46 +08:00
我也知道 pg 比 mysql 好。但是还是用 mysql。
为什么? 因为 mysql 用的人多,如果有坑,会有人在你之前去趟平。。。 |
46
stabc 2017-11-21 14:43:27 +08:00
@cstj0505
所以,你的意思是同样配置同样数据,MYSQL 100 个并行,PG 10 个并行,结果是 MYSQL 几个小时(我们就当超过 2 个小时),PG 只要 7 分钟。 那么我认为你还是忽略了某些很重要的因素,因为单纯数据库的性能不可能差距这么大。 |
47
cstj0505 OP @wsy2220 比别说,听过就算不错了。我旁边十几年的 oracle dba,维护者上百个 oracle 实例,完全没听过。
其他人也都是开始给他们用了才知道的 |
48
buliugu 2017-11-21 14:44:34 +08:00
推荐神奇的 https://github.com/dmtolpeko/sqlines,目前见过性能最好的 sql 数据迁移工具
|
50
picone 2017-11-21 14:45:33 +08:00
@glues #30 这已经是 16 年的文章了。阿里早就放弃开源数据库,NoSQL 或者 Oracle 系了,自己弄了个 OceanBase,而且逐步取代原有的数据库。今年双 11 支付宝完全是跑在 OceanBase 了。
|
52
picone 2017-11-21 14:48:54 +08:00
MySQL 的配置太多,它默认的配置只是比较保守的配置。
如果真要大批量导入数据,可以试试 disable key 了再导入,飞一般的体验。 |
55
stabc 2017-11-21 14:56:31 +08:00
@cstj0505 不是默认配置不代表是最优配置。你问问他们写入瓶颈在哪里看他们是否清楚就能猜到一二了。
PG 是以“稳固、先进”著称的,如果谁问我选什么数据库我会优先推荐 PG,但是如果单纯问哪个数据库更快我还是会说 MySQL。 |
56
cstj0505 OP @picone 有试过,之前建议他们关闭索引,有改善但不明显。
都有索引(他们索引比较多,貌似 60 还是 100 来个)的情况下,mysql 写入一分钟只有 3 万行 /s,pg 是 387 万行 /s |
57
cstj0505 OP @stabc 是不是最优配置我就不清楚了,那个环境我也没登上去过。pg 的配置也只是从开发环境拷过去的一个配置,当时应该是按照 8 核 16GB 来配的。
他们这个场景应该是个 olap 的场景,在这方面,pg 的优化器更先进,数据吞吐量更大,查询可以并行执行的特点其实更适合他们 |
58
thecon 2017-11-21 15:14:59 +08:00
几亿条数据用 navcat 导入..., 我也是醉了
|
59
Hozzz 2017-11-21 16:00:39 +08:00
oracle 不是随便用?被查到最多买几套意思下继续用...
|
60
leopardwei 2017-11-21 16:07:21 +08:00
不想说哪个好哪个差,用最熟悉最合适的就好,都有一堆的解决方法
|
61
cstj0505 OP 又问了下,pg 的 4 多秒的时候是带索引的写入,一共有 100 个索引。
|
62
crazyneo 2017-11-21 16:23:59 +08:00
说都说不到点子上,一般吹 pg 比 mysql 好都是要吹流复制、并行读写、pgxz/gpdb 的事务管理,还有就是更完整的软件生态比如 cuda/ml 接口库,比如多应用类型支持,比如扩展数据源接口等等等等,有时候还会吹一吹查询优化器的遗传算法+动态规划。你这个例子里 pg 支持的列存引擎是速度差异的最重要因素,估计你光看结果都不知道为啥……
只做应用和运维的话,最好不要贬低一个抬高另一个。 |
63
assad 2017-11-21 16:51:03 +08:00
还是喜欢 Mysql,坑大家都踩的差不多了。好解决
|
64
sunsh2017 2017-11-21 17:11:24 +08:00
我用 pg 的原因是,它支持的数据类型比较多,array,jsonb 数据类型,都很不错。
|
65
cstj0505 OP @crazyneo 你哪里看到我用了列存?还是你自己脑补的,“估计你光看结果都不知道我说了什么吧”
你列的那些需要吹吗,用过的人自然懂,没用过的你和他说他也不知道。基本的 copyin 你看有几个人知道 |
66
XIVN1987 2017-11-21 17:24:53 +08:00
好奇,,为什么快那么多??原因是啥?
按说都是一个时代的东西,不可能 PG 有什么高科技技术 MySQL 开发人员不会啊! |
67
acczefly 2017-11-21 18:18:55 +08:00
一个级别的东西,没必要鼓吹某一个。。。
pg 要真能这么好大家早就全切换 pg 了 |
68
crazyneo 2017-11-21 18:21:36 +08:00
@cstj0505 什么,你用 pg 做 olap 不用列存…… copyin 这是客户端的水果糖而已,字节流而已,实际上就是命令行的 copy,mysql 对应的是 csv load data,你先查查这二者的对比再来说……
你抬 pg 我不知道啥基本想法,德哥给 pg 打过多少年广告了,从来没有什么拿 copyin 来作为切入点的。顺便给德哥打个广告,https://github.com/digoal/ 算是国内 pg 业界内资深大佬吧。 |
69
cstj0505 OP @crazyneo 谁告诉你 olap 就必须用列存的。再说列存也不是 pg 原生支持的,pg 的优化器并没有为列存专门做优化,列存相比原生的堆处理能有多大优势。你自己脑补的够多的。
话说 pg 好用我还不能抬 pg 了?什么时候自己的嘴要账在别人身上。至于为什么说 copyin,只是恰好别人跑压测测到这个环节而已。批量导入确实谁都有,在你眼里 copyin 就是命令行的 copy 命令,那是你没玩好,copyin 在实时数据导入,流处理方面好处多了去。 德哥为 pg 做的贡献搞 pg 的谁不知道。 |
70
crabRunning 2017-11-21 19:08:22 +08:00
还在用 5.5 各位大佬都用 8 了
|
71
cjyang1128 2017-11-21 19:13:58 +08:00
特别不习惯 pg 命令行那些反斜杠开头的命令
|
72
notreami 2017-11-21 19:41:27 +08:00
pg 多少钱,我 oracle 买了!!!
|
74
frittle 2017-11-21 19:57:17 +08:00
没用过 postgresql 不奇怪,但没听说过就太孤陋寡闻了吧?
|
75
owenliang 2017-11-21 20:00:01 +08:00
看过 instgram 用 pg 做图片服务器,前面加一层 http cache。
|
76
sfqtsh 2017-11-21 20:00:55 +08:00 via Android
pg 的文档写的非常好
|
77
cstj0505 OP @est 列存我知道好,不过 pg 优化器没有专门为列存做优化,我看一些评测下面 pg 下列存的效果不明显。
|
78
sunchen 2017-11-21 21:47:32 +08:00
@est 生产环境 postgres + vertica + s3 + kafka 一套看上去很简单的组件, 但是干啥都是美滋滋
|
80
azh7138m 2017-11-22 02:01:59 +08:00 via Android
@panpanpan 一般用 navicat 迁移的,都是不建索引的主,性能慢其实也可以理解了:)
|
81
kn007 2017-11-22 07:47:24 +08:00 via Android
呵呵
|
82
cstj0505 OP @yangqi 你内行,几亿条数据你 7 分钟从 oralce 搞进 8 核 16g io100 左右的机器上的 mysql 我就服你,有本事别只会打嘴炮啊
|
83
cstj0505 OP @azh7138m 后来直接用 java 写了代码开了 10 个线程写,也就 30000 条一分钟
|
85
azh7138m 2017-11-22 08:49:51 +08:00 via Android
@cstj0505 MySQL 性能没这么不堪,姿势不对而已,
光说数据量没啥意思啊,load file 导入 20+G 数据,7.5kw 条,DO 的小 VPS 也就用了 30 分钟 |
86
cstj0505 OP @azh7138m load file 当然快啊,但是 load file 要先把数据从 oracle 里面写出来落地吧,再 load 到 mysql。不知道您这个数据多少索引,他们是几十张表,一共上面有 100 个索引
|
87
DavidGao 2017-11-22 09:01:52 +08:00
目前使用 PG 9.5,准备紧跟时代步伐使用 PG 10
|
88
hjlmjx 2017-11-22 09:05:39 +08:00 via Android
呵呵,呵呵,呵呵呵
|
89
leeg810312 2017-11-22 09:07:44 +08:00 via Android
在 lz 的环境中 pg 性能好就符合 lz 的观点了,认为 lz 不对的,lz 放点模拟数据出来,让楼上试试 mysql,有更好的方案也好让大家学习,也可以证明 mysql 的性能,这样互相嘴炮有啥意思?
|
90
kindjeff 2017-11-22 09:10:51 +08:00 via iPhone
为啥我用 mysql5.6 load data 四百万条数据才几十秒钟。
|
91
cstj0505 OP @kindjeff 这种导出到文件的,每个数据库都快。
我们同事是数据在 oracle 里面,不在文件里面。如果导文件每天要倒一次还要比较记录条数,控制数据格式,重建索引,如果把这个做成一套逻辑的话就比较麻烦了 |
92
zacard 2017-11-22 09:23:09 +08:00
围观数据库大佬的解决方案
|
93
sagaxu 2017-11-22 09:23:43 +08:00 via Android
copyin 和 insert 原理不同,你应该分别尝试下 mysqldump 的几种不同体位
|
95
cstj0505 OP @sagaxu 他们数据源在 oracle 里面,不好用 mysqldump 吧
实际业务场景就是 oracle 与文物库里面的数据,每天算好报表以后同步到 mysql。大概几十张表,100 个索引,数据量 40 多 G。 |
96
cstj0505 OP @azh7138m navcat 是现在在生产上跑的。
然后这次测试他们有分别用过 kettle/和手写 java 程序 先导数据,再建索引;索引存在的时候导数据。测下来 10000 条 /30s 左右就没测了。数据落地的方案肯定要快些,但是流程控制比较长,他们也没人专门维护这个,所以不愿意选择 |
97
janxin 2017-11-22 09:36:49 +08:00
MySQL 优点,用的人多,当然坑也多,好歹搜索能找到答案=,=
|
98
kiddult 2017-11-22 09:51:10 +08:00
看楼主描述大概能猜出同事的水平了,一个事情如果两种方式做,能有数量级的差距,基本是方式问题,不过具体到工具上,楼主真的觉得 MySQL 的开发人员智商会比 PG 的低一个数量级?我是不信 O(∩_∩)O
|
99
cloudzhou 2017-11-22 10:06:48 +08:00
这个事情我刚好测试过,分别是:
1 单个插入 2 批量插入 3 批量 + 事务 4 Load File 并且 Sql vs PrepareStatement,不同的批量个数,并发等 几种方式比较,时间数量级别的差距 所以这个本身你们就是要考虑的,需要仔细调优 |
100
robinlovemaggie 2017-11-22 10:42:33 +08:00
用 NoSQL 的表示笑而不语,你们接着吵……
|