我们目前正在使用MySQL来构建我们正在构建的产品,并且希望尽快转移到PostgreSQL,主要是出于许可的原因.
还有其他人做过这样的举动吗?我们的数据库是应用程序的命脉,最终将存储TB数据,所以我很想知道性能改进/丢失的经验,转换SQL和存储过程的主要障碍等.
编辑:只是向那些问我们为什么不喜欢MySQL许可的人澄清.我们正在开发一种商业产品,它(目前)依赖于MySQL作为数据库后端.他们的许可证明我们需要支付他们每个安装的定价的一定百分比,而不是固定费用.作为创业公司,这不是很吸引人.
史蒂夫,我不得不一路迁移我的旧应用程序,即PgSQL-> MySQL.我必须说,你应该认为自己很幸运;-)常见问题是:
SQL实际上非常接近语言标准,所以你可能会遇到你已经知道的MySQL方言
MySQL的悄然截断超过最大长度VARCHAR处理,而PG抱怨 - 快速的解决方法是让这些列,而不是"VARCHAR""文本",并使用触发器来截断长行
使用双引号而不是反向撇号
使用IS和IS NOT运算符比较布尔字段,但是仍然可以使用与MySQL兼容的INT(1)和=和<>
没有REPLACE,使用DELETE/INSERT组合
Pg对于强制执行外键完整性非常严格,所以不要忘记在引用上使用ON DELETE CASCADE
如果你将PHP与PDO一起使用,记得将参数传递给lastInsertId()方法 - 它应该是序列名,通常用这种方式创建:[tablename] _ [primarykeyname] _seq
我希望至少有一点帮助.和Postgres一起玩很开心!
我做了类似的转换,但出于不同的原因.这是因为我们需要更好的ACID支持,并且能够让Web用户通过其他数据库工具(两者都有一个ID)看到相同的数据.
以下是让我们感到困惑的事情:
MySQL不严格像PostgreSQL那样强制执行约束.
有不同的日期处理例程.这些将需要手动转换.
任何不期望ACID合规性的代码都可能成为问题.
也就是说,一旦它到位并经过测试,它就会更好.出于安全原因和大量并发使用而正确锁定,PostgreSQL的性能优于MySQL.对于不需要锁定的东西(只读),性能不是很好,但它仍然比网卡快,所以这不是问题.
提示:
contrib目录中的自动脚本是转换的良好起点,但通常需要稍微触摸一下.
我强烈建议您使用可序列化隔离级别作为默认值.
pg_autodoc工具非常适合真正查看您的数据结构并帮助查找您忘记定义和实施的任何关系.