Oracle与MySQL常见区别

107 阅读3分钟
  • 分页

Mysql:select ... from ... where ... limit x,y;

Oracle:select ... from ... where ...rownum>x and rownum <y;

  • 执行计划

S :< explain select * from xxx limlt 5,5>

O:< explain plan for select * from xxx where rownum >5 and row num <=10>

  • 隔离级别

    • Mysql:默认读已提交,都支持串行化最高级别。Oracle:默认可重复读。
    • 读一致性。每个Session提交后其他Session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块实现读一致性,每个session查询时,若对应数据块变,Oracle会在undo表空间中为这个session构造他查询时的旧的数据块.mysql没有类似Oracle的构造多版本数据库的机制,只支持读已提交的隔离级别,一个session读取数据时,其他session不能更改数据但可在表最后插入数据。session更新数据时,要加上排他锁,其他session无法访问数据。
  • 对事务的支持

mysql在innodb存储引擎的行级锁的情况下才可支持事务,Oracle完全支持。

  • 持久性

mysql数据库重启或更新会丢失数据,Oracle会把提交的sql操作先写入在线练级日志文件,保持到磁盘上,可随时恢复。

  • 并发

mysql表锁为主,对资源锁定粒度大,innodb可行锁,但行锁机制依赖索引,若无索引,仍是表锁。

oracle行锁,不依赖索引。对并发支持好很多。

  • 逻辑备份

mysql逻辑备份要锁定数据才能保证备份的数据是一致的,影响业务正常的dml使用,Oracle逻辑备份不锁数据且数据一致.

  • 复制

mysql复制服务器配置见到那,但主库出问题时,从库可能丢失数据,且需要手动切换从库到主库.

Oracle既有推或拉的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题,可自动切换备份库到主库,配置复杂.

  • 性能诊断

mysql诊断调优少,主要有慢查询日志.

oracle有各种成熟的调优工具,能实现自动分析/诊断.如awr,addm,sqltrace,tkproof等.

  • 单引号

mysql可双引号,oracle只可单引号,插入和修改字符串前必须做单引号的替换,把所有出现的一个单引号替换成两个双引号。

  • 翻页的sql语句

mysql翻页简单limit,oracle繁琐,每个结果集只有一个rownum字段表面他的位置。只能rownum<xxx,不能rownum>xxx。

  • 长字符串

oracle插入修改最大可操作字符长度小于4000字节,若更大,可用clob字段,方法借用oracle自带的dbms_lob程序包,插入修改记录前一定做非空和长度判断。

  • 日期

mysql日志字段分DATE和TIME两种,Oracle只有date,

数学公式,mysql找到7天DATE_FIELD_NAME>SUBDATE(NOW(),INTRVAL 7 DAY) ,Oracle:DATE_FIELD_NAME>SYSDATE - 7;

  • 空字符串

mysql的非空字段也有空的内容,oracle里定义了非空字段就不容许有空的内容。按mysql的not null来定义Oracle表结构,导数据的时候会产生错误。因此导致据时要判空。

  • 字符串模糊

mysql用like‘%%’,oracle也可like但是‘%xxx’索引失效,oracle的instr(字段名,'字符串')>0更精准。

m:select * from xxx where xxx.aa like'%qqq%';

o: select * from xxx where instr(xxx.aa,'qqq')>0;