数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

客观公正地评价MySQL和PostgreSQL的优劣


发布日期:2022年10月26日
 
客观公正地评价MySQL和PostgreSQL的优劣

前言

前一段时间我曾经翻译过一篇将你的网站从MySQL改为PostgreSQL其实当初我更感兴趣的是一个应用程序的后台数据库从MySQL转为PostgreSQL的具体操作并没有关心MySQL和PostgreSQL的优劣没想到反应出乎意料的大因此我也就觉得有写这篇文章的必要了

在这篇文章中我们选用MySQL alpha与PostgreSQL 进行比较因为MySQL alpha开始支持事务的概念因此这样的比较对于MySQL应该较为有利

我们这样的比较不想仅仅成为一份性能测试报告因为至少从我个人来看对于一个数据库稳定性和速度并不能代表一切对于一个成熟的数据库稳定性肯定会日益提供而随着硬件性能的飞速提高速度也不再是什么太大的问题

两者的共同优势

这两个产品都属于开放源码的一员性能和功能都在高速地提高和增强MySQL AB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择

两者不同的背景

MySQL的背后是一个成熟的商业公司而PostgreSQL的背后是一个庞大的志愿开发组这使得MySQL的开发过程更为慎重而PostgreSQL的反应更为迅速

这样的两种背景直接导致了各自固有的优点和缺点

MySQL的主要优点

首先是速度MySQL通常要比PostgreSQL快得多MySQL自已也宣称速度是他们追求的主要目标之一基于这个原因MySQL在以前的文档中也曾经说过并不准备支持事务和触发器但是在最新的文档中我们看到MySQL alpha已经开始支持事务而且在MySQL的TODO中对触发器约束这样的注定会降低速度的功能也列入了日程但是我们仍然有理由相信MySQL将有可能一直保持速度的优势

MySQL比PostgreSQL更流行流行对于一个商业软件来说也是一个很重要的指标流行意味着更多的用户意味着经受了更多的考验意味着更好的商业支持意味着更多更完善的文档资料

与PostgreSQL相比MySQL更适宜在Windows环境下运行MySQL作为一个本地的Windows应用程序运行(在NT/Win/WinXP下是一个服务)而PostgreSQL是运行在Cygwin模拟环境下PostgreSQL在Windows下运行没有MySQL稳定应该是可以想象的

MySQL使用了线程而PostgreSQL使用的是进程在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多

MySQL可以适应/运行在绝大多数情况下你不需要为MySQL运行任何清除程序PostgreSQL目前仍不完全适应/运行这是因为你必须每隔一段时间运行一次VACUUM

MySQL在权限系统上比PostgreSQL某些方面更为完善PostgreSQL只支持对于每一个用户在一个数据库上或一个数据表上的INSERTSELECT和UPDATE/DELETE的授权而MySQL允许你定义一整套的不同的数据级表级和列级的权限对于列级的权限PostgreSQL可以通过建立视图并确定视图的权限来弥补MySQL还允许你指定基于主机的权限这对于目前的PostgreSQL是无法实现的但是在很多时候这是有用的

由于MySQL alpha开始支持事务的概念因此事务对于MySQL不再仅仅成为劣势相反因为MySQL保留无事务的表类型这就为用户提供了更多的选择

MySQL的MERGE表提供了一个独特管理多个表的方法

MySQL的myisampack可以对只读表进行压缩此后仍然可以直接访问该表中的行

PostgreSQL的主要优点

对事务的支持与MySQL相比经历了更为彻底的测试对于一个严肃的商业应用来说事务的支持是不可或缺的

MySQL对于无事务的MyISAM表采用表锁定一个长时间运行的查询很可能会长时间地阻碍对表的更新而PostgreSQL不存在这样的问题

PostgreSQL支持存储过程而目前MySQL不支持对于一个严肃的商业应用来说作为数据库本身有众多的商业逻辑的存在此时使用存储过程可以在较少地增加数据库服务器的负担的前提下对这样的商业逻辑进行封装并可以利用数据库服务器本身的内在机制对存储过程的执行进行优化此外存储过程的存在也避免了在网络上大量的原始的SQL语句的传输这样的优势是显而易见的

对视图的支持视图的存在同样可以最大限度地利用数据库服务器内在的优化机制而且对于视图权限的合理使用事实上可以提供行级别的权限这是MySQL的权限系统所无法实现的

对触发器的支持触发器的存在不可避免的会影响数据库运行的效率但是与此同时触发器的存在也有利于对商业逻辑的封装可以减少应用程序中对同一商业逻辑的重复控制合理地使用触发器也有利于保证数据的完整性

对约束的支持约束的作用更多地表现在对数据完整性的保证上合理地使用约束也可以减少编程的工作量

对子查询的支持虽然在很多情况下在SQL语句中使用子查询效率低下而且绝大多数情况下可以使用带条件的多表连接来替代子查询但是子查询的存在在很多时候仍然不可避免而且使用子查询的SQL语句与使用带条件的多表连接相比具有更高的程序可读性

支持Rtrees这样可扩展的索引类型可以更方便地处理一些特殊数据

PostgreSQL可以更方便地使用UDF(用户定义函数)进行扩展

那么我究竟应该使用MySQL还是PostgreSQL

这个问题很难说得清而且事实上除了MySQL和PostgreSQL外使用OracleSybaseInformix等也是明智的选择如何你确定只在MySQL和PostgreSQL中进行选择以下规则总是有效的

如果你的操作系统是Windows你应该使用MySQL

如果你对数据库并不了十分了解甚至不知道事务存储过程等究竟是什么你应该使用MySQL

如果你的应用对数据的完整性和严肃性要求不高但是追求处理的高速度例如是一个论坛和社区你应该使用MySQL

你的应用是一个严肃的商业应用对数据完整性要求很高而且你希望对一些商业数据逻辑进行很好的封装例如是一个网上银行你应该使用PostgreSQL

你的应用处理的是地理数据由于RTREES的存在你应该使用PostgreSQL

你是一个数据库内核的狂热爱好者你甚至希望拥有你自己版本的数据库毫无疑问你必须使用PostgreSQL没准下一个PostgreSQL版本中某一个模块的作者就是你

结语

以上只是希望从我的理解客观公正地评价MySQL和PostgreSQL的优劣其中的带有倾向性的意见只代表个人观点由于本人水平的限制有不当之处还请批评指正

上一篇:mysql数据库find

下一篇:MySQL & Perl, 便利之合