有多少人从MySQL转向Postgresql?这样做值得吗?

11

我正在考虑在Rails开发中从MySQL迁移到Postgres,想听听其他进行过这种迁移的开发者对此的看法。

我寻求的是个人经验,不是Mysql与Postgres之间的比较,只是您自己得出的利弊分析。一些人可能没有想到的事情。

您也可以解释一下为什么首先要进行迁移。


应该是社区维基 -- 对于这个问题没有一个单一正确的答案。 - Pär Wieslander
更不用提存在无数类似的问题了。 - Milen A. Radev
正确的答案将是提供有关从MySQL迁移到PostgreSQL的最详细和深入见解的帖子,就像我所问的那样。而这里的问题特别涉及Rails开发,不同于其他帖子。 - concept47
4个回答

8
我做出了转变,坦白地说,我感到非常满意。虽然Postgres缺少MySQL的一些功能(主要是Insert Ignore、Replace、Upsert和Load Data Infile),但它所具备的特性足以弥补这些不足。Postgres存储过程更加强大,编写复杂函数和聚合函数也更加容易。
就性能而言,如果你将其与InnoDB进行比较(因为MVCC只有这样才公平),那么它至少感觉上和InnoDB一样快,甚至可能更快——由于某些限制,我们无法进行真正的测量,但绝对没有性能问题。多个连接的复杂查询显然更快,快得多。
我发现从Postgres社区中更容易获得正确的答案。每个人都有50种不同的方法来处理MySQL的问题。在Postgres中,访问邮件列表,你很可能会得到很多非常好的帮助。
任何语法和差异方面的问题都是有点琐碎的。
总的来说,对我而言,Postgres感觉更加“成熟”。我使用MySQL已经很多年了,现在我会尽量避免使用它。

完全同意。我的祖母总是打扰我,提出一些疯狂的方案,试图掩盖MySQL中缺少工作检查约束的问题。 - Ian Mackinnon

5

哦,亲爱的,这可能会以泪水告终。

仅从个人经验来看,我们之所以放弃MySQL,是因为我们的生产系统(Heroku)运行的是PostgreSQL。我们有专门为MySQL构建的查询,在PostgreSQL上出现了问题。因此,我想这个故事的寓意就是尽量在同一种DBMS上运行,否则你可能会遇到问题。

我们有时也需要快速插入记录。为此,我们使用PostgreSQL内置的COPY函数,类似于我们应用程序中的以下用法:

query = "COPY users(email) FROM STDIN WITH CSV"
values = users.map! do |user|
  # Be wary of the types of the objects here, they matter.
  # For instance if you set the id to a string it will error.

  %Q{#{user["email"]}}
end.join("\n")

raw_connection.exec(query)
raw_connection.put_copy_data(values)
raw_connection.put_copy_end

这个操作在不到两分钟的时间内向数据库插入了约500,000条记录。如果我们添加更多字段,大约需要相同的时间。

PostgreSQL相比MySQL还有另外几个优点:

  • 全文搜索
  • 地理查询(PostGIS)
  • LIKE语法如下:email ~ 'hotmail|gmail'NOT LIKE则是email !~ 'hotmail|gmail'。其中|表示或。

总之:PostgreSQL就像砖头和水泥,而MySQL则像乐高积木。选择适合自己的即可,这只是我的个人意见。


1
~!~是正则表达式运算符。~~LIKE的快捷方式。更多详情请参见http://www.postgresql.org/docs/8.4/static/functions-matching.html。使用raw_connection调用COPY是一个很方便的技巧。 - Jason Weathered
我相信你也可以在MySQL中进行全文搜索? - Joshua Partogi

1

我们在2007年初(或者是前一年?)出于几个原因转向了PostgreSQL。主要原因如下:

  • SQL支持 - PostgreSQL对于复杂的SQL查询,例如带有大量连接和聚合的查询,要比MySQL好得多。
  • MySQL的存储过程感觉不够成熟。
  • MySQL许可证变更 - 双重许可证,开源和商业,这种分裂让我对未来产生了疑虑。使用PG的BSD许可证,您可以做任何想做的事情。
  • 错误行为 - 当MySQL计算行数时,有时它只返回一个近似值,而不是实际计算的行数。
  • 约束行为有点奇怪,插入截断/适应值。请参见http://use.perl.org/~Smylers/journal/34246
  • 管理界面PgAdminIII比MySQL的对应产品更加稳定和成熟。
  • PostgreSQL在发生故障时非常坚固和安全。

// John


0

虽然我自己没有转换,但MySQL缺乏事务模式更改曾经让我吃过几次亏,而Postgre显然支持这一点。

这将解决当你从sqlite的开发环境移动到MySQL服务器时遇到的那些令人讨厌的问题,并意识到你的迁移出了问题并且被留下了一半!(不,我没有在生产服务器上这样做,但它确实搞乱了我们的共享测试服务器!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接