- 分页
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;