- 浏览: 722973 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
一剪梅:
关于您对于 hasRolePermission 用法的解释, ...
OFBIZ安全性技术(翻译) -
沈寅麟:
数据模型资源手册卷3中文版出版了 -
donaldjohn:
恭喜恭喜, 预祝大卖
数据模型资源手册卷3中文版出版了 -
成大大的:
OFBiz电商实战百度网盘下载:http://pan.baid ...
OFBiz入门实训教程 -
成大大的:
OFBiz电商实战百度网盘下载:http://pan.baid ...
OFBiz促销码生成解释
我使用哪个数据库: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%是作为发送新信息的。
进一步地,就以上所说,我都使用从现成的数据中提取的数据,你得不出比此更真实的情况了。
数值
实际测试结果:
并发连接 w/p:
10 客户 - 10.27 页/秒333.69 kb/s
20 客户 - 10.24 页/秒332.86 kb/s
30 客户 - 10.25 页/秒333.01 kb/s
40 客户 - 10.0 页/秒324.78 kb/s
50 客户 - 10.0 页/秒324.84 kb/s
75 客户 - 9.58 页/秒311.43 kb/s
90 客户 - 9.48 页/秒307.95 kb/s
100 客户 - 9.23 页/秒300.00 kb/s
110 客户 - 9.09 页/秒295.20 kb/s
120 客户 - 9.28 页/秒295.02 kb/s (2.2% 失败)
并发连接w/10% 插入:
30 客户 - 9.97 页/秒324.11 kb/s
40 客户 - 10.08 页/秒327.40 kb/s
75 客户 - 9.51 页/秒309.13 kb/s
MySQL
并发连接测试 w/p:
30 客户 - 16.03 页/秒 521.01 kb/s
40 客户 - 15.64 页/秒 507.18 kb/s
50 客户 - 15.43 页/秒 497.88 kb/s
75 客户 - 14.70 页/秒 468.64 kb/s
90 - mysql 崩溃
110 - mysql 崩溃
120 - mysql 崩溃
并发连接测试w/op:
10 客户 - 16.55 页/秒537.63 kb/s
20 客户 - 15.99 页/秒519/51 kb/s
30 客户 - 15.55 页/秒505.19 kb/s
40 客户 - 15.46 页/秒490.01 kb/s 47 失败
50 客户 - 15.59 页/秒482.24 kb/s 82 失败
75 客户 - 17.65 页/秒452.08 kb/s 363 失败
90 客户 - mysql 崩溃
并发连接 w/10% 插入运算:
20 客户 - 16.37 页/秒531.79 kb/s
30 客户 - 16.15 页/秒524.64 kb/s
40 客户 - 22.04 页/秒453.82 kb/sec 378 失败
我觉得测试结果中最有意思的事情是观察没有出错情况下已经装入运行的Postgres能负载多少。实际上,Postgres在没有错误的情况下负载好像要比MySQL高3倍。MySQL在负有40-50个并发连接时开始失常,而在没有其它影响的情况下,Postgres能使120个并发连接运行自如。我的猜测是:如果有足够的内存与够快的CPU,Postgres能够正常负载的远远不止120个并发连接。
表面上看,这显然是Postgres的一个巨大的胜利,但是如果你仔细观察一下更多细节的测试结果,可以发现Postgres生成每页的时间要长2 -3倍,所以它需要扩展负载至少2-3倍则刚好能与MySQL打成平手。所以按照不出错误的情况下,两者并发生成尽可能多的页,则他们之间几乎没有什么差别。按照某一时刻生成一页的情况看,MySQL确实快2-3倍。
另外一个有趣的事情是:在以上叙述的"10%插入运算"的测试中,MySQL在分解运算方面快一些。研究表明,当插入运算操作发生时,MySQL锁定整个表,而Postgres有一个美妙的"better than row-level locking"的机制。这个不同很快引起了MySQL并发连接的堆积,从而导致崩溃。同样的,如果你正在从数据库中进行大量的选中操作,而另外的进程正在对表进行插入操作。Postgres可以完全地不受干扰,而MySQL会堆积连接直到像纸牌做的房子一样崩溃。
你会发现在PHP中的稳定的连接并不有助于MySQL多少,相反却明显地有助于Postgres。实际上,其于稳定的连接的Postgres测试要快30%。这就告诉我们,Postgres在开放性连接与确认进程上需要占用大量的系统开销。其中有一些是Linux的错误和它的和僵硬的进程安排。尽管如此,MySQL并不再乎你如何看待它。
MySQL
MySQL的优缺点已经为许多人所知道:它是一个快速的、轻量级的数据库,但是基本上可以为大多数的网站服务得很好。
无论如何,如果你计划在一个高流量的站点(说明,每天生成多于500,000页)上,那么忘了MySQL吧。因为它往往会崩溃或者在装入运行后死机。任何曾经访问过Slashdot的人都可以证明它的弱点。(mod_perl and MySQL)
话说回来,MySQL证明了可使极大多数网站的页生成速度最高在每秒15页。如果你经常地运行在每秒15页之上,那么你将会非常高兴地支付更大的服务器或者Oracle license的费用。
优势
明显地,MySQL胜过Postgres的优势就在于性能。而且在它的发行版中,还具有一些强有力的管理工具。(其中一些工具允许你察看进程并且可以在程度运行时进行动态调试。)比如热备份,文件毁坏恢复工具等。
我也非常热衷于MySQL的命令行工具。你可以使用描述和察看命令来观察数据库与表的结构。而Postgres的命令则明显地少(/d可以显示一张示范表)
局限性
从数据库行家听说的第一件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你计划使用MySQL写一个关于银行、会计的应用程序,或者计划维护一些随时需要线性递增的不同类的计数器,你将缺乏 transactions功能。在现有的发布版本的MySQL下,请不要有任何的这些想法。(请注意,MySQL的测试版3.23.x系列现在已经支持 transactions了)。
在非常必要的情况下,MySQL的局限性可以通过一部分开发者的努力得到克服。在MySQL中你失去的主要功能是subselect语句,而这正是其它的所有数据库都具有的。换而言之,这个失去的功能是一个痛苦,但是它可以被克服。
稳定性
MySQL在长期使用的稳定性上失了分。比如,MySQL在运行了30-60天左右的时间后,没有理由地就放弃了随机ghost。许多开发者使用 "statically"来编译MySQL就是为了这个原因,而且这个方法帮助了许多人。这个问题也可以通过设置一个好的调度程序让MySQL每月被杀死并重起一次来克服。这并不是一个完全可取的方法,但至少也是一个办法。
MySQL在守护进程的健壮性上也失了分,但这个缺点被MySQL从来不会出现不可靠的数据文件而弥补。最后一件让人担心的事就是你重要的数据文件会不期地出错,而MySQL却很好地解决了这一点。在一整年的运行MySQL之后,这从未见过数据文件或索引文件轻易地出错。而在同样的时间内,我已经为一些Postgres数据库做了2-3次的恢复了。(记住,备份永远是你最好的朋友,这点可以从PHPBUILDER数据的崩溃看出)
PostgresSQL
Postgres的测试结果可能会使许多人感到惊奇,尽管Postgres在一些网站开发者中声誉并不怎么好(最初的Postgres的发布版本中除了对落后的性能以外,而对其他部分大肆散布谣言)。但根据我的经验和测试,这些不良声誉并不完全有理由。实际上,PostgresSQL可以承受3倍于 MySQL的负载而且没有任何错误,当然在相同的硬件和系统环境下。
Postgres一般运行在 10页/每秒的速度之上,足够为 400,000页/每日的流量服务,假定一个规则的流量曲线峰值2倍于最小值。这是一个可怕的数量,它远远地超过了大多数人要在他们的网站上看到的数量。此外,网站的大多数页没有这次测试中的那么复杂。正如MySQL的情况一样,如果你可以超过这个最高限度,你将会非常乐意地花钱添置硬件。由于 Postgres的结构,如果你增加处理器和内存,那么它的性能可以继续增长。
优势
Postgres有一些非常高级的功能。而其中的大多数功能我并不使用,它们被真正的数据库高手所采用。许多开发者不利用这些功能,从而无法实现他们的想法。
例如,如果你正需要做多次的更新/插入/删除操作,你可以利用transaction。比如,你要在你的用户列表中插入一个新的用户,同时在另一个表中,要插入一行,而且也要更新别处的一个标志。假如这样,如果第一次插入成功,而第二次失败,你怎么办?在Postgres中,你可以回退全部操作,而观察出错的缘由。而在MySQL中,出错时你会非常紧张,除非你安排了一些逻辑可以控制这个局面。在实际应用中,第一个问题不会出错,除非你是一个糟糕的程序员。而如果第二个问题出错,那么这个结果并不非常严重。(除非这是一个不允许出错的而冒险的程序,比如会计、银行业、评论界的应用程序。)
无论如何,在Postgres7。0+中现在已经支持了外部关键字,那就意味着当你插入一行,数据库会做一些公正而合理的校验检察。同样,如果你要删除当前表一行,而有另一个表依赖于当前表,数据库则不会让你操作。我喜欢这个想法并且能预见如何利用这个功能重写整个网站。
Triggers 和Views是能够在Postgres中,而不是在MySQL中使用的有趣而有用的工具。尽管我都没有使用过,但我可以想象如果我重新设计SourceForge时将如何地频繁利用views。
局限性
Postgres的主要局限性并不是它的性能(因为大多数网站将永远不会陷入这个问题)。但是由于编码硬化的限制,像每行8k的限制(日期会回到以前的时期)。当我使用Postgres设计Geocrawler.com,我不得不将大的e-mail分成每8k一块以绕过这个僵硬的限制。在默认情况下,Postgres被编译成只支持32个连接,这是不足以用来作高流量网站应用的,特别是考虑到Postgres生成每页的速度要比 MySQL慢。
另一个限制可警惕许多PHP的用户:Postgres没有与MySQL的mysql_insertid()等价的函数调用。如果在MySQL的数据库中插入一行数据,MySQL将返回这行主关键字的ID。而在Postgres中完成这样一个操作需要绕许多圈子,这是一件非常头痛的事,而且如果用的多可能会降低效率。
稳定性
Postgres在长时间运行的情况下运行流畅而不出错。我的Postgres 6.5.3装在又老又累的PowerMac 8500上,无错运行已经有90天了;而且每天生成50-100,000页。当Postgres装入运行,不会退出,而在压力下不需要ghost。
Postgres有一个问题是当你确实发生问题时,一般它就真坏了。在一些旧的Postgres6.4.x中,我还发现了更加严重的问题:许多重复而相同的数值被插入到同一个主关键字中(这是不允许在任何情况下出现的)
Postgres还有另一问题就是会出现令人紧张的不完整的索引和表,你不能略过或摆脱它。我在Postgres7中没有再发现过它,但我没有对其全面使用,所以无法知道更多。
结论
这次测试几乎证实了我所知道的:两个数据库系统都可以为大多数网站非常好地服务。它们与桌面数据库,像FileMaker和MS Access相比,非常明显地快。Postgres 和 MySQL都是自由而免费的,而且有积极的开发团体所支持。
如果要在两者间选择一个,你首先需要明白你面临的限制并且知道你是否需要Postgres的transaction的支持或者MySQL的large-text-area支持。你可能都要,这种情况下,你只有等到将来的某一天,两者推出新的稳定发布版。
需要提出的一件非常有趣的事是:这两个数据库似乎会在某处重合,就是当MySQL具有transaction的支持并且慢慢加入一些新的功能如:subselect,而Postgres在执行性能和稳定性上有所改进时。
最后,作为数据库高手选择,Postgres应当非常灵活。外部关键字,views,subselects,和transactions都非常地棒--如果你需要并且应用它们。如果你不需要或不使用这些功能,你最好使用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%是作为发送新信息的。
进一步地,就以上所说,我都使用从现成的数据中提取的数据,你得不出比此更真实的情况了。
数值
实际测试结果:
并发连接 w/p:
10 客户 - 10.27 页/秒333.69 kb/s
20 客户 - 10.24 页/秒332.86 kb/s
30 客户 - 10.25 页/秒333.01 kb/s
40 客户 - 10.0 页/秒324.78 kb/s
50 客户 - 10.0 页/秒324.84 kb/s
75 客户 - 9.58 页/秒311.43 kb/s
90 客户 - 9.48 页/秒307.95 kb/s
100 客户 - 9.23 页/秒300.00 kb/s
110 客户 - 9.09 页/秒295.20 kb/s
120 客户 - 9.28 页/秒295.02 kb/s (2.2% 失败)
并发连接w/10% 插入:
30 客户 - 9.97 页/秒324.11 kb/s
40 客户 - 10.08 页/秒327.40 kb/s
75 客户 - 9.51 页/秒309.13 kb/s
MySQL
并发连接测试 w/p:
30 客户 - 16.03 页/秒 521.01 kb/s
40 客户 - 15.64 页/秒 507.18 kb/s
50 客户 - 15.43 页/秒 497.88 kb/s
75 客户 - 14.70 页/秒 468.64 kb/s
90 - mysql 崩溃
110 - mysql 崩溃
120 - mysql 崩溃
并发连接测试w/op:
10 客户 - 16.55 页/秒537.63 kb/s
20 客户 - 15.99 页/秒519/51 kb/s
30 客户 - 15.55 页/秒505.19 kb/s
40 客户 - 15.46 页/秒490.01 kb/s 47 失败
50 客户 - 15.59 页/秒482.24 kb/s 82 失败
75 客户 - 17.65 页/秒452.08 kb/s 363 失败
90 客户 - mysql 崩溃
并发连接 w/10% 插入运算:
20 客户 - 16.37 页/秒531.79 kb/s
30 客户 - 16.15 页/秒524.64 kb/s
40 客户 - 22.04 页/秒453.82 kb/sec 378 失败
我觉得测试结果中最有意思的事情是观察没有出错情况下已经装入运行的Postgres能负载多少。实际上,Postgres在没有错误的情况下负载好像要比MySQL高3倍。MySQL在负有40-50个并发连接时开始失常,而在没有其它影响的情况下,Postgres能使120个并发连接运行自如。我的猜测是:如果有足够的内存与够快的CPU,Postgres能够正常负载的远远不止120个并发连接。
表面上看,这显然是Postgres的一个巨大的胜利,但是如果你仔细观察一下更多细节的测试结果,可以发现Postgres生成每页的时间要长2 -3倍,所以它需要扩展负载至少2-3倍则刚好能与MySQL打成平手。所以按照不出错误的情况下,两者并发生成尽可能多的页,则他们之间几乎没有什么差别。按照某一时刻生成一页的情况看,MySQL确实快2-3倍。
另外一个有趣的事情是:在以上叙述的"10%插入运算"的测试中,MySQL在分解运算方面快一些。研究表明,当插入运算操作发生时,MySQL锁定整个表,而Postgres有一个美妙的"better than row-level locking"的机制。这个不同很快引起了MySQL并发连接的堆积,从而导致崩溃。同样的,如果你正在从数据库中进行大量的选中操作,而另外的进程正在对表进行插入操作。Postgres可以完全地不受干扰,而MySQL会堆积连接直到像纸牌做的房子一样崩溃。
你会发现在PHP中的稳定的连接并不有助于MySQL多少,相反却明显地有助于Postgres。实际上,其于稳定的连接的Postgres测试要快30%。这就告诉我们,Postgres在开放性连接与确认进程上需要占用大量的系统开销。其中有一些是Linux的错误和它的和僵硬的进程安排。尽管如此,MySQL并不再乎你如何看待它。
MySQL
MySQL的优缺点已经为许多人所知道:它是一个快速的、轻量级的数据库,但是基本上可以为大多数的网站服务得很好。
无论如何,如果你计划在一个高流量的站点(说明,每天生成多于500,000页)上,那么忘了MySQL吧。因为它往往会崩溃或者在装入运行后死机。任何曾经访问过Slashdot的人都可以证明它的弱点。(mod_perl and MySQL)
话说回来,MySQL证明了可使极大多数网站的页生成速度最高在每秒15页。如果你经常地运行在每秒15页之上,那么你将会非常高兴地支付更大的服务器或者Oracle license的费用。
优势
明显地,MySQL胜过Postgres的优势就在于性能。而且在它的发行版中,还具有一些强有力的管理工具。(其中一些工具允许你察看进程并且可以在程度运行时进行动态调试。)比如热备份,文件毁坏恢复工具等。
我也非常热衷于MySQL的命令行工具。你可以使用描述和察看命令来观察数据库与表的结构。而Postgres的命令则明显地少(/d可以显示一张示范表)
局限性
从数据库行家听说的第一件事就是MySQL缺乏transactions,rollbacks, 和subselects的功能。如果你计划使用MySQL写一个关于银行、会计的应用程序,或者计划维护一些随时需要线性递增的不同类的计数器,你将缺乏 transactions功能。在现有的发布版本的MySQL下,请不要有任何的这些想法。(请注意,MySQL的测试版3.23.x系列现在已经支持 transactions了)。
在非常必要的情况下,MySQL的局限性可以通过一部分开发者的努力得到克服。在MySQL中你失去的主要功能是subselect语句,而这正是其它的所有数据库都具有的。换而言之,这个失去的功能是一个痛苦,但是它可以被克服。
稳定性
MySQL在长期使用的稳定性上失了分。比如,MySQL在运行了30-60天左右的时间后,没有理由地就放弃了随机ghost。许多开发者使用 "statically"来编译MySQL就是为了这个原因,而且这个方法帮助了许多人。这个问题也可以通过设置一个好的调度程序让MySQL每月被杀死并重起一次来克服。这并不是一个完全可取的方法,但至少也是一个办法。
MySQL在守护进程的健壮性上也失了分,但这个缺点被MySQL从来不会出现不可靠的数据文件而弥补。最后一件让人担心的事就是你重要的数据文件会不期地出错,而MySQL却很好地解决了这一点。在一整年的运行MySQL之后,这从未见过数据文件或索引文件轻易地出错。而在同样的时间内,我已经为一些Postgres数据库做了2-3次的恢复了。(记住,备份永远是你最好的朋友,这点可以从PHPBUILDER数据的崩溃看出)
PostgresSQL
Postgres的测试结果可能会使许多人感到惊奇,尽管Postgres在一些网站开发者中声誉并不怎么好(最初的Postgres的发布版本中除了对落后的性能以外,而对其他部分大肆散布谣言)。但根据我的经验和测试,这些不良声誉并不完全有理由。实际上,PostgresSQL可以承受3倍于 MySQL的负载而且没有任何错误,当然在相同的硬件和系统环境下。
Postgres一般运行在 10页/每秒的速度之上,足够为 400,000页/每日的流量服务,假定一个规则的流量曲线峰值2倍于最小值。这是一个可怕的数量,它远远地超过了大多数人要在他们的网站上看到的数量。此外,网站的大多数页没有这次测试中的那么复杂。正如MySQL的情况一样,如果你可以超过这个最高限度,你将会非常乐意地花钱添置硬件。由于 Postgres的结构,如果你增加处理器和内存,那么它的性能可以继续增长。
优势
Postgres有一些非常高级的功能。而其中的大多数功能我并不使用,它们被真正的数据库高手所采用。许多开发者不利用这些功能,从而无法实现他们的想法。
例如,如果你正需要做多次的更新/插入/删除操作,你可以利用transaction。比如,你要在你的用户列表中插入一个新的用户,同时在另一个表中,要插入一行,而且也要更新别处的一个标志。假如这样,如果第一次插入成功,而第二次失败,你怎么办?在Postgres中,你可以回退全部操作,而观察出错的缘由。而在MySQL中,出错时你会非常紧张,除非你安排了一些逻辑可以控制这个局面。在实际应用中,第一个问题不会出错,除非你是一个糟糕的程序员。而如果第二个问题出错,那么这个结果并不非常严重。(除非这是一个不允许出错的而冒险的程序,比如会计、银行业、评论界的应用程序。)
无论如何,在Postgres7。0+中现在已经支持了外部关键字,那就意味着当你插入一行,数据库会做一些公正而合理的校验检察。同样,如果你要删除当前表一行,而有另一个表依赖于当前表,数据库则不会让你操作。我喜欢这个想法并且能预见如何利用这个功能重写整个网站。
Triggers 和Views是能够在Postgres中,而不是在MySQL中使用的有趣而有用的工具。尽管我都没有使用过,但我可以想象如果我重新设计SourceForge时将如何地频繁利用views。
局限性
Postgres的主要局限性并不是它的性能(因为大多数网站将永远不会陷入这个问题)。但是由于编码硬化的限制,像每行8k的限制(日期会回到以前的时期)。当我使用Postgres设计Geocrawler.com,我不得不将大的e-mail分成每8k一块以绕过这个僵硬的限制。在默认情况下,Postgres被编译成只支持32个连接,这是不足以用来作高流量网站应用的,特别是考虑到Postgres生成每页的速度要比 MySQL慢。
另一个限制可警惕许多PHP的用户:Postgres没有与MySQL的mysql_insertid()等价的函数调用。如果在MySQL的数据库中插入一行数据,MySQL将返回这行主关键字的ID。而在Postgres中完成这样一个操作需要绕许多圈子,这是一件非常头痛的事,而且如果用的多可能会降低效率。
稳定性
Postgres在长时间运行的情况下运行流畅而不出错。我的Postgres 6.5.3装在又老又累的PowerMac 8500上,无错运行已经有90天了;而且每天生成50-100,000页。当Postgres装入运行,不会退出,而在压力下不需要ghost。
Postgres有一个问题是当你确实发生问题时,一般它就真坏了。在一些旧的Postgres6.4.x中,我还发现了更加严重的问题:许多重复而相同的数值被插入到同一个主关键字中(这是不允许在任何情况下出现的)
Postgres还有另一问题就是会出现令人紧张的不完整的索引和表,你不能略过或摆脱它。我在Postgres7中没有再发现过它,但我没有对其全面使用,所以无法知道更多。
结论
这次测试几乎证实了我所知道的:两个数据库系统都可以为大多数网站非常好地服务。它们与桌面数据库,像FileMaker和MS Access相比,非常明显地快。Postgres 和 MySQL都是自由而免费的,而且有积极的开发团体所支持。
如果要在两者间选择一个,你首先需要明白你面临的限制并且知道你是否需要Postgres的transaction的支持或者MySQL的large-text-area支持。你可能都要,这种情况下,你只有等到将来的某一天,两者推出新的稳定发布版。
需要提出的一件非常有趣的事是:这两个数据库似乎会在某处重合,就是当MySQL具有transaction的支持并且慢慢加入一些新的功能如:subselect,而Postgres在执行性能和稳定性上有所改进时。
最后,作为数据库高手选择,Postgres应当非常灵活。外部关键字,views,subselects,和transactions都非常地棒--如果你需要并且应用它们。如果你不需要或不使用这些功能,你最好使用MySQL,而利用它优越的性能。
发表评论
-
优化数据库前,可以问自己的10个问题
2009-12-25 13:17 970在 优化你的数据库时,你可能没有用到这些细节的优点。以 ... -
Sequoia(基于JDBC的数据库集群中间件)用户手册
2008-12-30 08:54 3469http://haha8.runsky.com/forum/s ... -
优秀的开源MySql开发/管理软件集合
2008-12-01 12:32 2122MySql是目前应用最广泛 ... -
Navicat 管理mysql不错
2007-11-14 08:58 1683Navicat 管理mysql不错 javaeye上附 ... -
Derby入门
2007-09-21 22:01 1289http://www.blogjava.net/mrzha ... -
hsqldb First JDBC Client Example
2007-09-15 02:35 3065hsqldb自带的例子。看看就一切ok了,万事不求人啊。 Th ... -
Hsqldb初学
2007-09-15 01:22 4252java 代码 用了一下Hsqldb,感觉很精 ... -
org_myoodb_tools_classes 类图
2007-09-03 10:09 1102... -
myoodb_exception类图
2007-09-03 10:08 1195... -
面向对象的DBMS
2007-08-31 14:06 27931.数据库技术的发展 从60年代至今的30年中,信 ... -
org_myoodb_base相关类图
2007-08-29 17:06 1091... -
myoodb -objects类图
2007-08-29 10:29 1178动物的图 -
myoodb_extensions
2007-08-27 18:04 1153collectable 集合 Collectable ... -
myoodb例子的功能简单介绍
2007-08-24 16:45 1927# MyOODB - all database ... -
myoodb快速指南(翻译)
2007-08-21 13:48 2804myoodb快速指南 myoodb是一个面向对象的数据库,他 ...
相关推荐
3. **存储过程和函数**:MySQL和PostgreSQL的存储过程和函数语法不一致,`mysql2postgres`需要将MySQL的存储过程转换为PostgreSQL的函数。 ### 使用mysql2postgres的步骤 1. **安装**:首先,你需要获取`mysql2...
MySQL和PostgreSQL虽然都是关系型数据库管理系统,但它们的SQL语法在某些方面有所不同。例如,MySQL支持`ON UPDATE CURRENT_TIMESTAMP`特性,当表中的某个字段被更新时,该字段会自动设置为当前时间。而在PostgreSQL...
总结起来,“mysql postgres convert tool”是连接MySQL和PostgreSQL的桥梁,它简化了跨数据库的数据迁移过程,降低了操作难度,使用户能够更专注于业务本身。无论是开发人员进行项目迁移,还是数据库管理员进行系统...
mysql-to-postgres-MySQL至PostgreSQL数据转换 支持MRI或jruby。 master分支支持的最低Ruby版本是2.1.7 ,下一个发行版将具有相同的要求。 使用经过修改的Rails database.yml配置,您可以将mysql-to-postgres集成...
本项目是一款基于MySQL、Postgres、sqlite和dqlite数据库的Kubernetes运行设计源码,采用Go语言开发,并融入Python和Shell脚本。项目包含84个文件,其中包括42个Go源文件、6个YAML配置文件、3个Markdown文档、2个...
数据库环境:mysql5.6 postgres9.6 数据库表结构文件:db目录下postgres下的main.sql文件 数据库测试数据文件:db目录下的data.sql文件 python环境: python2.7 pip install tornado pip install psycopg2 pip ...
在使用 Navicat 客户端工具将 MySQL 数据库迁移到 PostgreSQL 之前,我们需要确保客户端工具 Navicat 能够同时连接 MySQL 和 PostgreSQL,并且连接用户都有权限对表有读写权限。 第一步:连接 MySQL 和 PostgreSQL ...
本资源提供了MyBatis Generator 1.3.5版本,包含了针对MySQL、Oracle和PostgreSQL数据库的配置XML以及对应的驱动包。 在使用MyBatis Generator时,首先要了解其核心概念: 1. **配置文件(generatorConfig.xml)**...
2.2 典型案例:在高级用法中,可以设置特定的数据库参数,例如在MySQL中设置网络读写超时时间,在PostgreSQL中设置维护工作内存和工作内存大小,以及搜索路径等。同时,可以定义类型转换规则,比如将MySQL中的bigint...
MySQL和PostgreSQL分别使用`my.conf`和`postgresql.conf`作为系统配置文件,同时也各自拥有管理客户端连接的配置文件:MySQL的`my.conf`和PostgreSQL的`pg_hba.conf`。 #### 十二、XML支持与数据管理工具 虽然两者...
oracleweb 版 linux(终端[终端回放] 文件 脚本 进程 计划任务)、数据库(mysql postgres oracle sqlserver 达梦 高斯 sqlite)、redis(单机 哨兵 集群)、mongo 等集工单流程审批于一体的统一管理操作平web 版 linux...
xorm, 面向 Go,支持 mysql,postgres,tidb,sqlite3,sql,oracle的简单和强大的ORM 中文Xorm是一个简单而强大的Go 。 特性结构 <->-表映射支持可以链接的api事务支持ORM和原始SQL操作支持同步数据库架构支持查询...
passenger-stack, 用于 Apache,乘客,Memcached,Git,Mysql或者Postgres的宋体 ,five分钟至英雄用于 Sprinkle的脚本,提供工具观看演示屏幕铸造的乘客堆栈。如何让你的sprinkle:获取一个品牌打击新片/主机( ...
国外大牛写的一个mysql数据库转换postgresql的脚本。亲试可以无错误运行。
了解如何在Python环境中安装和使用此类库,以及对MySQL和PostgreSQL数据库的基本知识,对于进行跨数据库的数据迁移至关重要。在实际操作中,正确配置数据库连接参数,理解数据迁移的潜在问题,以及熟悉所使用的库的...
MYSQL、ORACLE、SQLSERVER、Postgres、Redis数据库等保测评作业指导书V1.1 本文档旨在提供一个综合的数据库等保测评作业指导书,涵盖MYSQL、ORACLE、SQLSERVER、Postgres、Redis等多种数据库管理系统。该指导书旨在...
MYSQL、ORACLE、SQLSERVER、Postgres、Redis数据库等保测评作业指导书
MySQL和PostgreSQL的备份通常涉及生成SQL转储文件,然后在Go程序中读取和存储这些文件。 4. **加密备份**: 为了保护备份数据的安全性,我们可以使用Go的加密库,如`crypto/aes`和`crypto/cipher`,对备份文件进行...
MySQL2PostgreSQLPro.msi