服务器 频道

关于MySQL和Postgres的具体比较

  【IT168 服务器学院】我使用哪个数据库:PostgreSQL 或 MySQL?这个老生常谈的问题已经困惑了开发者至少两年了。我全面地接触了这两个数据库系统(MYSQL有一年,而Postgres有二年了),而且对MySQL网站提出的关于两者之间的差异非常好奇。
  
  1999年9月,当我们正开始对SoureForge架设基础的时候,我对这两个数据库作了性能测试。当时,尽管我已经习惯于使用Postgres完成所有工作,但两者的性能差异是如此之明显以至与我们不得不采用MySQL。其他的惯用MySQL的开发者也拥护这个决定。
  
  在当时,这个性能测试要胜于平时任何人为的测试。我想看看这两个数据库在网站某一具体的网页上应用的情况。所提及的这个网页是SourForge讨论区。它包括3个表的简单相关结合。每个表有20-30,000行数据。以及递归的实现和嵌套的信息,所以数据库在此页上的应用确实是一个瓶颈。
  
  开始实行,我从库中卸下了真实的数据。编辑了SQL表,并且将其导入MySQL 3.22.30和PostgreSQL7.0.2,运行在拥有1G RAM 的VA Linux quad-xeon 4100 server上的Red Hat Linux 6.2上。
  
  使我陷入的第一个问题是,在Postgres中,有一个不可思议的问题:每行数据最多只能有8K。在信息公告板上,你时常会超过每行8K的限制。所以Postgres在导入数据时阻塞。为了能继续使用,我只得将数据的"body"抛弃,并且重新导入数据。Postgres 开发小组已经意识到了这个限制,并且在7.1的版本中修改了,而且他们告诉你,你可通过重新编译Postgres使得它支持32K/每行,尽管这样做会使整个系统的性能受到影响。
  
  在这一点上,我又陷入了Postgres另一个小问题上,它的"serial"数据类型(等价于MYSQL的auto_increment)会造成一个"sequence":当它的双亲表被抛弃时,它本身不被抛弃。因此,当你想重新创建这个表时,会引起一个名字冲突。有许多新的用户被这个问题所困惑,所以这些问题使Postgres在测试中失去一些优势。相反,MySQL聪明到它可以在你导入数据的时候对auto_increment进行自动增量,然而Postgres的sequence 不可以在你导入数据时重置,从而引起新插入操作的失败。
  
  方法
  为了尽可能地真实,我从网站上选择了实际的网页,并且使它轻巧地交叉于MySQL和Postgres之间。这基本上意味着所有mysql_query()调用将被pg_exec()替换。这个页包括许多选取与连接操作,与典型的网站做的差不多。
  
  一旦这个测试页运行和调试,我便使用"AB",就是"Apache Benchmarking"应用集,从我的工作站通过我的100M局域网到达quad-xeon服务器。为了在负载的数量上得到一个概念,我使用AB进行各种并发连接的测试,从10-120,当离开了这些页后,这个数稳定在了1000上。
  
  为了更加地接近实际应用,我在脚本中安置了一个随机数生成器,它插入页面的10%的数据到数据库中。在PHPBuilder中所有讨论区页面有10%是作为发送新信息的。
  
  进一步地,就以上所说,我都使用从现成的数据中提取的数据,你得不出比此更真实的情况了。
  
0
相关文章