postgresqloraclemysql_Oracle和MySQL、PostgreSQL特性对
随着现代数据库可⽤特征集的迅速增加,很难区分孰好孰坏。例如Oracle⾥就有许多你可能从来都不需要的⾼级数据仓库特征。此外也可能有⼀些其它不可或缺的特征⽐如ACID事务特性。我们来看⼀看主要的⼀些特征,⽐如存储过程,视图,快照,表数据类型和事务等等。同时我们分析⼀下Postgresql,MySQL和Oracle这⼏个数据库,然后出哪个能够满⾜你的需求。
存储过程
数据库⾥的存储应⽤程序肯定会有它的拥护者和贬低者。在这个问题上我还不清楚⾃⼰属于哪⼀类,所以我尽量对这两个⽅⾯都讨论。当你开始在数据库⾥放置应⽤程序代码时,你就处于了彻底不可移植的境地。你把应⽤程序移植到另⼀个数据库时,那段代码将不得不被重写。但是它对原来数据库的⾼度专⼀性意味着它可以利⽤那个引擎,和那个引擎紧紧捆绑在⼀起。有时候数据库⾥的存储代码要明显快得多。在对数据做了修改之后,你不得不更新⼀百万⾏的某些数据块。
在存储过程⾥,数据的读⼊、操纵和更新是⼀步完成的。然⽽你要在中间层应⽤程序中做同样事情的话,你就不得不通过⽹络发送数据集,完成数据操纵,然后将它发送回来。这不但使任务的速度变慢,
⽽且竞争同⼀数据的其他事务有可能不得不等待,因为它需要的数据正处于传送和操纵状态。存储代码也可以⽤来密封特定的请求,这对简化你整体的应⽤程序是很重要的。这三个数据库都⽀持存储过程和函数。Oracle还⽀持包,或者说是存储过程的集合以及⼏乎没有⼈⽤过的各种⾯向对象特征的集合。还要说明⼀点,⼀个数据库引擎实际上是在存储代码和嵌⼊在⾥⾯的SQL代码之间关联转换。Oracle 9i版本引⼊了成批绑定技术,所以你能够对许多⾏进⾏处理,并且能够⼀次性更新它们,⽽不是单个循环迭代。这个特征⼤幅度改善了性能。
视图
seo具体怎么优化视图基本上是存储查询,正因为如此执⾏起来才不会过度复杂。然⽽当⽤于查询时,他们必然会使查询复杂化。所以很明显,数据库在视图可⽤之前⼀定要⽀持⼦查询。Oracle很早就已经有视图了。从5.0版本开始,MySQL也已经⽀持视图。跟Oracle⼀样,MySQL也⽀持UPDATEABLE视图,但是有⼀些限制。Postgres也⽀持视图和UPDATEABLE视图。更详细的解释见Complex SQL部分。
物化图(快照)
不⽤说,Oracle对它们⽀持得⾮常好。作为⼀种新事物,物化图(我更喜欢快照这个可视化的术语,有点离题了)是⼀个周期性更新的副本或者是表的⼦集。可以把视图看做是查询的⼀个副本。直到下⼀次刷新,那个副本是静态的,没从主机那⼉更新的。通常要在更新频率和⽀持它的事务⽇志(⽐如索引)的
维护之间做⼀个折衷。名义上,MySQL和Postgresql不⽀持物化图,然⽽互联⽹上有它的实现,可能会满⾜你的需求,你要是选择此⽅案的话就另外需要⼀些⽀持了。⼀个存储程序创建物化图,另⼀个存储过程刷新它。在本质上,⼀个CREATE TABLE语句就是AS SELECT..的拷贝。
语⾔集成
如今,基于web的编程应⽤虽然使⽤了不同的数据库,却是完全平等的。⼏乎所有的web编程语⾔都⽀持这些数据库类型。
Java,PHP,Perl,Python,C#/.NET,等等等等。尽情享受编程的乐趣吧!
触发器
MySQL,Oracle和Postgres都⽀持INSERT,UPDATE和DELETE操作的BEFORE和AFTER事件触发器。就我个⼈⽽⾔,除⾮万不得已我不会使⽤触发器。因为他们常常被忘记,有时反⽽给你添乱。少量使⽤的话,效果反⽽会很好。
所有这三个数据库都有它的脆弱性。软件肯定有⼀些死⾓故障隐藏其中,这是它的本性。此外,这三个数据库都会定期发布更新包。然⽽我个⼈的感觉是,开源意味着必然有更多的⽬光,并且经常更多的是挑剔的⽬光盯在程序上⾯。⽽且在开源世界⾥社区施加的压⼒要⼤得多。在商界,当修理费⽤远
远⾼于等待补丁的费⽤时,⼚家可以并且经常会耍⼿段。
在数据库内部的安全性⽅⾯,所有这三个数据库都⽀持⼝令登录和数据库内部各种类型的加密。Oracle确有⼀种新特征叫做虚拟专⽤数据库,其中表的段和列都可以被编码,对于视图是隐藏的。这对于⼀些有争议的或是敏感的数据⾮常有⽤,DBA和其他管理员对这些数据是⽆权访问的。
结论
很明显,这三个数据库平台都有⼤量的特征,对于同⼀问题也有不同的解决⽅案。就安全性,触发器,视图,物化图和存储过程⽽⾔,他们提供了许多⼀样的功能,尽管在性能和配置⽅⾯有些差异。在第⼆部分,我们将讨论数据库真正开始千差万别的⼀些⽅式,从索引⽅⾯,可能最重要的是从它们的优化引擎⽅⾯。
在前⾯对数据库的⽐较中,我们提到了⼏种不同的特征,⽐如触发器,视图和存储过程。虽然在Oracle,Postgresql和MySQL中这⼏个特征集彼此之间有所不同,但是你遇到的⼤部分应⽤都是集中在这⼏个⽅⾯。这⼀次,我们将讨论这⼏个平台之间存在明显差异的⼀些东西,最重要在于它们处理SQL复合语句和优化选择的⽅式上。
SQL复合语句(优化引擎)
不管你选择哪个数据库,SQL语⾔都是你和数据库交互的最基本和最重要的⽅式。 这也正是这三个平台开始分道扬镳的地⽅。 Oracle⽀持⼤量复杂的查询,⼏乎是⽆限多的表和所有类型的联结以及组合。但这些充其量只是冰⼭⼀⾓,Oracle真正的王牌在于它的Cost Based Optimizer(基于代价的优化器),它分析SQL语句,如果可能的话会重写和简化它,基于代价选择索引,根据驱动表和其他⼀些神秘的⽅式来做出决定。
读⼀下MySQL的⽂档你就会发现性能偏见的来源,这些是⼚家细节类型,它使得性能优化和性能调节在任何平台上都很复杂。MySQL能够处理的任何JOIN或者VIEW语句的固定最⼤值是61张表。 我个⼈⼜有点疑问,不管怎么说,应⽤程序中表太多了处理起来会更困难,所以正如前⾯所说,确实是优化器⽽不是能够查询的最⼤表规格占上风,等等。
Postgresql 8.x版⽀持所有的SQL92规范,⼏乎没有什么限制。 我再次认为,⼀种数据库优于其他数据库在于优化程序⽅⾯做得好。复合查询很⿇烦,所以查询策略就成了你分析性能瓶颈的最好参考。
java编辑器eclipse
索引类型
索引技术对数据库性能来说是很关键的,Oracle在这⽅⾯提供了很多的选择。⽬前存在着太多的索引类型,从标准的B树到反向键,再到基于函数的时常误⽤的位图索引,甚⾄index-only表。作为附加技术,DBA还可以使⽤Oracle Text,它提供了索引能够让你查CLOB(⼤字符对象),⽽且Oracle Spatia
l提供了基于位置数据的索引。
在MySQL⾥,我们发现有B树,哈希表,全⽂和GIS索引(基于位置数据),还有簇索引,但是如果我在Oracle⽅⾯的经验有任何指导作⽤的话,我可以说这些跟⼤多数应⽤程序都是不相关的。⼤部分时候,B树索引是我在Oracle,MySQL和Postgres应⽤中能看到的唯⼀⼀种索引。除此之外,就算作为⽰例,基于函数的索引在MySQL中也是没有的,但是它们能够靠创建另⼀列使⽤那个函数和⼀些数据来模拟,然后再增加⼀个触发器使它更受欢迎。
Postgresql提供了B树和哈希表,以及r树和它⾃⼰个性化的GiST索引类型,它允许创建⽤户⾃定义类型和基于函数的索引。Oracle也提供了⼀种类似的函数,其中它的基于函数的索引能够⽤于基于pl/sql的函数,⽽不仅仅是标准的系统预定义函数,例如那些你可能不会⽤到的trunc,UPPER函数。但是你要⼩⼼了,这样的索引很可能访问速度极慢,当它从你的表中输⼊输出数据的时候,速度慢得你甚⾄都可以放慢语速加⼊讨论了。
再次强调⼀下,Oracle真正胜出的地⽅就在于它的实现⽅式和优化器选择索引的策略上。mysql语句转oracle>spring boot mybatis多数据源切换
Oracle允许你通过审核跟踪设施对表和⽂件启⽤审计功能。⼀旦启⽤,你可以审计插⼊,更新或者删除⼀个特定的表,还可以注册,甚⾄是某⼀特定⽤户对数据库全部的访问。你有相当多的选择权,并且启⽤很容易。
Postgresql也有这个函数,据说跟Oracle的同样灵活、易于配置。
另⼀⽅⾯,MySQL的核⼼函数中好像不提供这个函数,你当然可以构建⾃⼰的存储过程和触发器来做你想做的事情,并把相应的信息填⼊⼀张表中,只是相对⿇烦⼀些。
数据类型
便宜 虚拟主机Oracle,MySQL和Postgresql都⽀持4GB⼤的⼆进制数据和⽂本数据。所有我们认识和喜欢⽤的数据类型它们都⽀持,⽐如数字,字符和⽇期类型。 每⼀个数据库⼜在不同程度上提供⼀些个性化的数据类型,虽然我在应⽤程序中很少看到它们。
我还要说的是,Postgresql和MySQL的资产已经超过了原来的投资,不再害怕实现⼀个我们经常使⽤的⾃动递增列类型。Oracle坚持按部就班地做事,认为这样效率会更好,但是进步很缓慢。Oracle也没有SET数据类型,要是有就好了。 它也不没有time-only数据类
型,Postgresql和MySQL却都有。但是从功能上来说,你会发现在这三个数据库平台上能够⽤⽇期和时间类型来做你想做的任何事情,从时区的处理到时间间隔的处理等等。
我喜欢Postgresql和MySQL的另⼀个地⽅是它们对多种数学优化数值类型的⽀持,从smallint到decimal,real,double类型等等。这些利⽤了下⾯的体系结构实现,并且和程序设计语⾔(⽐如C语⾔)
display属性显示的类型相匹配。
事务⽀持
在数据库领域,适当的事务处理⾸字母简写为ACID特性,它的意思是原⼦性(Atomicity),⼀致性(Consistency),隔离性(Isolation)和持久性(Durability)。 原⼦性的意思是事务是⼀个完整的单元,全部提交或者全部回滚。⼀致性的意思是从⼀个合法的状态到另⼀合法状态,即你实施合适的约束条件能够执⾏商业逻辑。隔绝性的意思是⼀个事务看不见另⼀个事务在做什么,直到它提交。持久性的意思是⼀旦提交了,改变就是永久性的,关键是你要保护硬件不出故障。
关于这个问题我有⼏点要说,希望没有在此引起⽂化争战。我看到过许多像这样的陈述,说任何企业类应⽤决不会使⽤那些没有实现全部ACID特性的的数据库,⽽且⾮事务性的表也是毫⽆⽤处的。这些都是愚蠢的结论。例如, Oracle⾃⼰数据字典中的性能视图就不是事务性的。原因是什么?如果他们那样做的话系统的整体性能就不可预测了。其次,在那种环境下也不⼀定要这样做。有许多像那样的应⽤程序。我曾经阅读过⼀个航空售票系统,它需要升级增加第⼆服务器来容纳Oracle。他们正在查所有相关的许可证代价,包括软件成本的和⼤块的硬件成本。然后他们再返回检查应⽤程序。有⼈想出⼀个聪明的办法,实现售票点上90%的通信量是在浏览航班(只读),⽽实际上只有10%的⼈正在买票。所以,他们建⽴了⼀组低成本的MySQL服务器⽤于浏览航班,⽽把订票请求重定向到可靠的Oracle服务器上来处理。这是多么棒的⼀种混合解决⽅案啊!
我承认MySQL和它的InnoDB表在事务部分已经有了很⼤改进。那或许可以解释为什么Oracle并购Innobase。仍有⼀些⼈坚持说MySQL 只是LDAP或者NFS的⼀种结构化查询语⾔界⾯。然⽽,MySQL确实已经有了很⼤进步并且会继续挑战那些贬低者。
Postgresql在这⽅⾯要健全⼀些,所以我主要说的是,你将只会看到它和Oracle的性能差异,仅此⽽已。
结论
正如你从我们对数据库平台的横向对⽐中看到的那样,当选择⼀种数据库平台的时候要考虑很多问题。从特征的完整性到⼚家的⽀持、社区⽀持,以及性能和优化都要考虑。在你充分了解你所构建的应⽤和它的真正需求之前不要过多投资。最后说的这些可能是模糊不清的并且难以证实,但是有了⼀点创造⼒和对这个问题艰苦的思考,以及⼀个良好的发展态势,你将会到⼀种耗费合理、性能坚固的解决⽅案。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。