Oracle和Mysql的区别

Oracle和Mysql的区别

一、主要区别点

1. 软件规格:

  • Oracle是大型数据库,占用内存多;
  • Mysql是轻量型数据库,轻量级,内存占用更小;

ps: 我用docker拉了一下2者的镜像,mysql大小545M,oracle11g则需要6.85G
在这里插入图片描述

2. 费用:

  • Oracle收费的
  • Mysql免费

3. 数据量

  • Oracle单表数据量,可以千万,甚至上亿的规模;
  • Mysql单表数据量,最好控制在百万级别;

4. 并发性

  • Oracle使用行级别的锁,不依赖索引来锁定某一行,锁资源的粒度小,所以并发性高
  • Mysql只有InnoDb支持行锁,而且必须依赖索引才能用到行锁,否则会使用表锁,所以并发性较低

5. 持久性

  • Oracle有在线联机日志,可以恢复因为意外宕机导致的数据丢失
  • Mysql如果意外宕机,假设数据还没来得及从缓存写入到磁盘,则会出现数据丢失

6. 主从复制

  • Oracle支持多机容灾,在主库出现问题的时候,可以自动切换为主库
  • Mysql的主从复制比较简单,主库出现问题的时候,需要重新去手动配置哪个是主库

7. 事务隔离级别

  • Oracle默认的是 read commited(读已提交)的隔离级别,会有不可重复读+幻读的问题
  • Mysql默认是 repeatable read(可重复度)的隔离级别,只会有幻读的问题

8. 权限

  • oracle的权限,有用户组的概念;
  • mysql的权限,没有用户组的概念;

9. 用法有区别

二、用法区别举例

2.1数据库结构层次

  • oracle的表,是创建在各个用户下面的;
    在这里插入图片描述
  • mysql的表,是创建在各个数据库下面的;
    在这里插入图片描述

2.2字段类型

常用的字段类型不一样

  • oracle常用的字段类型:数字常用Number、字符常用varchar(2)
  • mysql常用的字段类型:数字常用int、double、字符常用varchar

拓展说明:

  1. oracle的varchar,一般不使用,那个是sql标准的类型,允许空串,oracle自己开发了个类型叫varchar2,不允许存空串,而且可以兼容以后的oracle版本
  2. oracle虽然有float、binary_float、binary_double,但是和number比起来,有区别:
    (1)首先是这3种类型,都不允许指定scale,也就是小数的位数,我尝试了一下这几个字段,scale修改为2,navicat中一点击保存,还是变回了0;
    (2)其次binary_float、binary_double,这2个,存储空间更小(number最多需要22个字节存储,而他们,分别需要5个、9个字节来存储)

时间的字段类型不一样

  • oracle的时间类型,是date,或者timestamp,包含年月日时分秒
  • mysql的时间类型,不但有datetime、timestamp,还有仅仅包含年月日的date,仅仅包含时分秒的time

2.3 id递增的处理

  • oracle需要通过手动新建1个序列+触发器来实现;
-- 第一步:创建序列(ps: 也可以通过navicat创建)
create sequence SEQ_T_LOCALOBTMIND
-- 验证序列是否能成功取到值
select SEQ_T_LOCALOBTMIND.nextval from dual

-- 第二步:设置触发器(ps: 请确保表名、字段都是大写的,否则触发器执行会失败)
create or replace trigger T_LOCALOBTMIND_INSERT_ID
before insert on "T_LOCALOBTMIND" for each row
begin
	select SEQ_T_LOCALOBTMIND.nextval into:NEW.ID from dual;
end;

-- 第三步:测试
INSERT INTO "T_LOCALOBTMIND"("DDATETIME", "OBTID", "WDIDF") VALUES (TO_DATE('2021-06-03 08:22:04', 'SYYYY-MM-DD HH24:MI:SS'), 'G1121', '11.34');


  • mysql则自带自动自增的功能

2.4分页

  • oracle需要用rownum 和 子查询来做;
-- 查第10-20条记录。10、20个数字表示记录的行号
select * from (
	SELECT emp.*, rownum as rowno from emp
)t_target
where rowno >= 10 and rowno < 20
  • mysql直接通过limit就行
-- 查第10-20条记录。第一个10表示起始下标,第二个10表示取多少条记录
SELECT * FROM `tb_user`
limit 10, 10

2.5时间处理

时间相减

  • oracle对于计算前7天,时间减7就行了,计算前1个小时,时间减1/24就行了,加法同理:
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 计算前7天,结果:2021-05-23 15:51:20

select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') - 1/24 from dual;
-- 计算前1个小时,结果:2021-05-30 14:51:20

  • mysql计算前7天,或者前1个小时,需要用不同的关键字:
select date_sub('2021-05-30 21:00:40' ,interval 7 day)
-- 计算前7天,结果:2021-05-23 21:00:40

select date_sub('2021-05-30 21:00:40' ,interval 1 hour)
-- 计算前1个小时,结果:2021-05-30 20:00:40

timestamp类型的时间相减</

  • 21
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值