Mysql与Oracle的50个区别

1. 有些人说Oracle没有限制,实际上他们说得多是Oracle不支持LIMIT语法.不过能够rownum虚列来实现,不过会更加麻烦.sql

  2. Oracle不支持偏移(offset)语法.数据库

  3. Oracle的复制功能可能比MySQL更加健壮,不过也更加难以配置.express

  4. 对于多个Master类型的系统,大部分用户都但愿你使用更加复杂也更加昂贵的Oracle RAC(虽然可能NDB更加健壮).编程

  5. Oracle的分区功能很是健壮,可是它不是内置的,并须要专门为此付费(分区功能是在Enterprise Edition里面是内置的).安全

  6. 在Linux/Unix上,Oracle并不象Mysql那么方便,不少Linux/Unix发行版默认就会自带Mysql.(我对这一点的理解与翻译可能都有误差)session

  7. INSERT … ON DUPLICATE KEY UPDATE语法将再也不可用,不过你须要学习更加复杂(可是符合SQL标准)的MERGE语法.架构

  8. Oracle的ROLE架构与MySQL有很大差别,没法再使用root角色来完整全部工做.(不过Sys用户的权限仍然与root相差无几,只是为了安全着想,不建议这么使用了).函数

  9. Role 账户与特定的Schema联系在一块儿(反之也同样),相似于MySQL数据库中的Database概念.(Role并不彻底与Schema联系在一块儿,系统有一些固定的role,这些Role包含部分已经定义好的权限集(privilege set),也能够再自定义部分新的role).工具

  10. 事实上,丢弃一切已知的关于链接访问的设置吧,Oracle使用一套全新的系统来处理链接访问.性能

  11. 支持全文搜索,不过语法彻底不一样.

  12. Oracle的文档很是丰富,不过,若是须要Oracle的专业服务,你须要拥有Metalink的访问权限.

  13. 在非数据库社区很难找到相关的支持信息(例如,PHP论坛或者网站开发者的网志)

  14. 自增功能能够经过Trigger与sequence对象来实现.

  15. 大量平常熟悉的SHOW命令将再也不可用,想要获取系统信息,须要你学习Oracle的数据字典(或信息Schema),深刻一点的还须要学习Oracle动态性能.

  16. MySQL为信息Schema添加了多个非标准的扩展,在Oracle中将很难找到这些信息.

  17. 为了管理好生产系统与非生产系统的的转入转出,须要你深刻理解Oracle的受权规则.

  18. 大致上讲,Oracle的数值类型更加简单,若是你确实须要相似于MySQL的多粒度的数值类型,就须要你本身来实现它,或者经过制定不一样的精度(Number(n,x))来实现.

  19. 在Oracle中,表能够作到无限制的增加,可是大部分状况下,都建议经过表空间(tablespace)来对此做细粒度的管理.

  20. Oracle不支持ALTER TABLE ADD COLUMN BEFORE|AFTER,也就是不支持本身制定字段的位置.(咱们这边以前有部分应用对字段顺序有严格地要求,不过,从理论上讲,这是业务设计的问题,主要是其大部分状况下都是使用select *或者insert table values来处理数据,而不是在select,insert中指定具体须要处理的字段名列表).

  21. 若是你习惯于经过图形界面(GUI)来管理数据库,你必定会喜欢上Oracle,可是若是你倾向于使用相似与Mysql 命令行的客户端,你可能会对sql*plus这个客户端工具感到失望(须要一个习惯的过程,sql*plus仍是蛮好用的).

  22. Oracle的数据校验比Mysql更加严格,依赖于MySQL的模糊规则可能会致使应用没法运行.MySQL接受”0000-00-00″来做为日期类型的值就是个典型的例子.

  23. 虽然Oracle的PL/SQL功能更强,可是它不支持标准的PSM语言来编写存储过程,所以你可能不得不学习它的非标准的语法.

  24. Oracle不支持ENUM数据类型,只能经过使用基于文本的check约束或者建立外键关联表来实现.

  25. Mysql的一些更加神秘的表类型(例如,blackhole,csv),在Oracle中找不到相对应的功能.
(不清楚blockhole是何种类型,不过Oracle的外部表(external table)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其余处理).

  26. Oracle中的Group By语句必须是肯定的,它须要select list中出现的全部列都必须包含在group by从句中.

  27. Oracle的exp命令输出的dmp文件没法象Mysql的转储文件同样能够手工修改.

  28. Oracle的底层实现有较大变化,须要你学习UNDO与REDO segment,归档,以及DBWR进程. (我的认为Oracle相对于其余数据库的主要的优点可能就是其UNDO/REDO的设计了.)

  29. Oracle不是开源软件,所以你没法在上面进行修补/优化/修复/实现你本身的东西.

  Robert Hodges

  30. Oracle的查询优化是一件须要专家介入的工做.它的优化器比MySQL的要成熟的多,这意味着查询计划也相应的更加难以解释.若是你有一个大的应用,请准备好聘用一位了解如何有效进行此项工做的伙计.

  31. Oracle的基于成本的优化器的有效运行须要精确的统计信息.对于发生变化的表,须要按期的为其收集统计信息.批量数据加载进程也须要在处理过程当中不时的执行estimate/compute statistics命令来收集统计信息以取得满意的性能.

  32. 在Oracle中,建立链接是个代价高昂的操做.性能良好的Oracle应用都倾向于使用链接池来最小化登录的开销.

  33. Oracle应用须要应用prepared statement以获取可观的性能.若是你的应用不使用prepared statement的话,须要对应用进行调整.这是应用Oracle数据库的标准编程实践.(此处的prepared statement应该更多的是指使用绑定变量).

  34. 应用须要关闭结果集游标,不然很快就会遇到著名的”ORA-01000 Too many open cursors”错误.在Oracle中,这被认为是一个用户错误,须要你去调整你的代码.

  35. 繁忙系统上的长查询可能会遭遇到” ORA-01555 Snapshot too old”错误.能够经过调整redo 段的大小(有时经过调整应用)来消除此错误,可是仍是须要你关注这一点.(此处的redo segments的表述是有点问题,此处应该是Undo tablespace以及对应的Undo Retention,Oracle没有所谓的redo segment的说法).

  36. Oracle没有相似于非事务表的概念.大部分Oracle用户都承认这一点.

  37. Oracle的临时表定义是持久的SQL对象,而且对全部用户均可见(此处应该理解成以此用户登录的会话,Session).这一点与MySQL中使用的轻量级表有区别,在MySQL中,临时表是在单个会话内建立并销毁的.

  Denish Patel

  38. 在Oracle中,多个Alter Table操做不能在同一个SQL语句中执行,例如alter table emp modify name varchar(64) not null, add gender char(1) not null;

  39. 默认状况下,Oracle不会自动提交.

  40. KILL命令在Oracle中无效,它使用alter system kill命令.(不清楚第一个kill是什么概念,操做系统级别的kill,Oracle仍是支持的,我常用).

  41. Oracle在Order by语句中不支持使用减号(-).(不清楚这个具体的减号是什么东西).

  42. Oracle的sqlplus命令行接口不支持高亮显示.

  Roland Bouman

  43. Oracle不支持group_concat或者相似的分组函数.须要你经过循环调取游标来实现,或者经过组合XMLAGG与XMLQUERY来实现你须要的查询.(在Oracle 9R2以后,可使用自定义聚合函数来实现这个功能,到Oracle 11gR1以后,Oracle本身还提供了一个新的listagg分组函数来实现这个功能).

  44. 对于count(distinct expression)函数,Oracle只支持一个表达式(要么一个列名,要么*),而Mysql支持一组表达式. (在Oracle中要实现一组表达式,能够经过使用子查询来实现).

  45. Oracle对子查询的支持很是好.不要由于Mysql中的习惯而不去使用它.

  46. Oracle不支持用户变量(@num).若是你须要利用它来计算运行时总和,能够利用分析函数(窗口函数)来实现.若是用用户变量来实现特定的汇总函数功能,你将发现Oracle已经有内置得功能支持这些功能.(另外在Oracle中,能够经过在package中应用dbms_session来设置context以实现用户变量).

  47. Oracle没有区分TIME与DATE类型,Oracle的Date类型实际上就是一个DATETIME类型(可是比MySQL支持一个更大的日期范围).

  48. 相对于MySQL来说,Oracle的存储过程与触发器功能与性能都要好不少.不要习惯性地不去使用它们.

  49. 若是须要在Oracle中编写存储过程,记得在开始编码前花点时间了解下Oracle是否是有相应的内置package.你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了.

  50 若是你在MySQL中有使用BLOB类型或者TEXT类型,你可能会将他们迁移到Oracle地BLOB与CLOB中.然而,与MySQL不一样,Oracle并非透明地实体化这些数据.在大部分状况下,这确实是件好事情,可是它也意味着若是你只是想把BLOB/CLOB看成文本处理,你将须要花费大量琐碎的时间来使用LOB函数,在使用之初,LOB函数仍是蛮让人气馁的.(LOB相关函数确实挺烦人,LOB的处理效率也很是差,即便是使用Oracle 11g的SecureFile).

 

经过以上50个区别的学习,相信你已经可以明白Mysql与Oracle的关系了

相关文章
相关标签/搜索