Oracle和MySQL的区别

来源:互联网 发布:淘宝唯美的刻字印章 编辑:程序博客网 时间:2024/06/06 02:03
简介:
1.Oracle是大型数据库,MySQL是中小型。
2.Oracle市场占有多,MySQL市场少。Oracle贵,MySQL不要钱(开源)。
3.Oracle支持大并发(多人同时使用)访问量也大,OLTP最好的工具(联机事务处理过程)。
4.Oracle安装很大好几G,MySQL不大只有几百M,Oracle非常占内存和性能。


使用:
1.M:offet,limit,O:rownum。
Oracle没有offet,limit,在mysql中我们用它们来控制显示的行数,最多的是分页了。oracle要分页的话,要换成rownum。

2.O序列增,M自动增。
oracle建表时,没有auto_increment,所有要想让表的一个字段自增,要自己添加序列,插入时,把序列的值,插入进去。

3.O:需要from dual,M:select 1。
oracle有一个dual表,当select后没有表时,加上的。不加会报错的。select 1 这个在mysql不会报错的,oracle下会。select 1 from dual这样的话,oracle就不会报错了。

4.O: null,not null,M:""就行。
对空值的判断,name != ""这样在mysql下不会报错的,但是oracle下会报错。在oracle下的要换成name is not null

5.O:必须单引号,M:随意。

oracle下对单引号,双引号要求的很死,一般不准用双引号,用了会报ERROR at line 1:ORA-00904: "t": invalid identifier而MySQL要求就没有那么严格了,单引号,双引号都可以。


6.O有to_number,to_date,M没有。

oracle有to_number,to_date这样的转换函数,oracle表字段是number型的,如果你$_POST得到的参数是123456,入库的时候,你还要to_number来强制转换一下,不然后会被当成字符串来处理。而mysql却不会。


7.O没有group_concat,M有。
group_concat这个函数,oracle是没有的,如果要想用自已写方法。

8.M权限差O很远,O200多种,还有角色管理。
mysql的用户权限管理,是放到mysql自动带的一个数据库mysql里面的,而oracle是用户权限是根着表空间走的。

9.Group by两个都有,用法不同。
group by,在下oracle下用group by的话,group by后面的字段必须在select后面出现,不然会报错的,而mysql却不会。

10.M引擎多,O好像不需要。
mysql存储引擎有好多,常用的mysiam,innodb等,而创建oracle表的时候,不需要这样的,好像只有一个存储引擎。

11.O无法改字段位置,M可以。
oracle字段无法选择位置,alter table add column before|after,这样会报错的,即使你用sql*plus这样的工具,也没法改字段的位置。

12.O字段类型没有M多。
oracle的表字段类型也没有mysql多,并且有很多不同,例如:mysql的int,float合成了oracle的number型等。

13.O中是没有substring这个函数的,M有的。

14.M主键是自动增长的类型,O没有自动增长类型,一般使用序列。(Oracle中的rownum与mysql的limit实现的功能相同,但没有mysql来的容易,它一般通过一个子查询来实现)

15.M空有空的内容,O空就必须是空。

16.模糊查询都是like,但是O的like不要用于索引,速度很慢。

区别:


1.并发:O行锁占有少,并发好,M更多表锁,并发差。
并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。虽InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。所以oracle对并发性的支持要好很多。

2.一致:O操作提交查看,M一个读,其他不能改,有限制。
oracle支持serializable的隔离级别,可以实现最高级别的读一致性。每个session提交后其他session才能看到提交的更改。oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。mysql没有类似oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。session更新数据时,要加上排它锁,其他session无法访问数据。

3.事务:O早就支持,M在innodb引擎下才支持,还是有限制。

4.恢复:O提交的都日志恢复,M意外后可能丢失。
oracle保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。mysql默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。

5.提交:O默认手动,MySQL默认自动。

6.备份:O备份不锁,MySQL备份锁。 
oracle逻辑备份时不锁定数据,且备份的数据是一致的。mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用

7.热备份:Oracle较成熟方便,一样不锁。
oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。mysql:myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。

8.语句:MySQL较灵活,Oracle传统。
mysql对sql语句有很多非常实用而方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。oracle在这方面感觉更加稳重传统一些。
 
9.复制:复制指复制库,O更好一些。
oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。
 
10.工具:O多,M少。
oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等mysql的诊断调优方法较少,主要有慢查询日志。
 
11.安全:O就那样,M屎一样。
mysql的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。oracle的权限与安全概念比较传统,中规中矩。
 
12.分区:O很成熟,M基本为0。
oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
mysql的分区表还不太成熟稳定。
 
13.拓展工具:O很多,M少。
oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。
0 0