知识总结--关系型数据库相关

oracle

oracle背景相当牛逼,oracle是美国军方数据库,是大名鼎鼎的甲骨文旗下的数据库。目前是银行、政府、军方、证券公司这些高机密机构首选数据库,是为了美国中央情报局设计的一款关系型数据库。oracle价格不菲,对于互联网公司来讲还是太贵了,互联网公司一般都使用开源的mysql数据库。

oracle值得如此高昂价格,它的性能极其强大,单实例可以支撑百万tps,对于oracle而言百万级别的表只是起步,即便是上亿数据量放在一张表中也不会有太大拖累。oracle可以轻松应对高并发,数据错误率和丢失率极低,安全性极高,有专业的维护团队。oracle数据库特性丰富可以让企业轻松扩展,但是缺点还是那个,贵的一笔,小公司都不会考虑使用。

mysql

mysql是一个开源的关系型数据库,目前属于oracle旗下。mysql常用于互联网公司、创业公司,主要原因是免费、功能也基本完善。但是免费有免费的道理,mysql的性能远不及oracle和db2,性能大概是他们的10分之一,而且对数据的可靠性和事务性的支持也没有这两个数据库强大,它内置执行引擎效率不高因此在写mysql sql语句时要注意当使用多表关联时一定要用join,对于同样的一条连表查询sql加join和不加join差别是极大的。mysql一张表的数据量不要超过千万,当数据量达到百万时就要考虑分库分表了,否则会很卡,查询效率会很低。mysql的存储过程也是不够成熟的,在使用mysql存储过程时要进行权衡,用mysql存储过程的效率可能还不及使用代码处理。目前很多大厂推出了自己优化的mysql数据库,性能相比开源的数据库有很大提升。

DB2

db2是最早使用sql的数据库,他对sql的优化非常好,比oracle要好到百分之10左右,mysql更是不值一提。它属于IBM旗下的数据库,收费产品很贵,比oracle还要昂贵。入门门槛有点高,对于用户并不是很友好,它的维护工具及插件没有oracle做的那么完备,很多调试监控都还需要写脚本来实现。db2性能极高,它提供了高层次的数据利用性、完整性、安全性、可恢复性,是目前市面上性能最好的关系型数据库,并且它天生支持分布式,对sql的优化几乎达到了极致。由于它的内置引擎极其强大因此db2的理论单表处理量在千万甚至是亿级别,它的存储过程也非常成熟,当使用db2时可以考虑多使用db2的存储过程以提高运行效率。常用于数据仓库和在线事物处理场景。

sqlServer

sqlServer是微软旗下的关系型数据库,与微软亲儿子.net可以无缝糅合。它内置于windows产品中,完全的图形化操作,上手极其简单,维护也很简单,在windows系统中安装只需要安装一个控件即可。sqlserver性能比较优异,优于mysql略低于oracle和db2,它的安全性不如oracle和db2,sqlserver常用于普通的擦边企业,因为内置于windows所以开发起来简单,经常与php或.net搭配使用。

oracle、mysql、db2和sqlServer对比

性能对比

      开放性:
      Mysql、oracle、DB2都是可以在当下几乎所有主流平台上使用的;
      而sql server只能在windows平台,没有丝毫的开放性;

      安全性:
      sql server没有获得任何的安全认证;
      oracle、DB2都获得了最高级别的ISO标准认证;

      性能:
      sql server在多用户时性能不佳
      DB2适用于数据仓库和在线事物处理性能较高
      oracle性能最高

      可操作性:
     sql server操作简便,但只有GUI;
     oracle操作比较复杂,同时有GUI与命令行操作,windows.NT及unix下一样;
     DB2及mysql操作比较简单,同时有GUI与命令行,windows.NT及unix下一样;
table操作
1,增加列:相同
  alter table test add mail varchar(128);
2,删除列:
  oracle 与mysql相同:alter table test drop column mail;
  db2 :alter table test drop column mail 删除列后需要reorg table(重组表)
3,更改列名
  oracle : alter table test rename column mail to mail2;
  mysql : alter talbe test change mail mail2 varchar(128);
  db2 : 不提供更改列名功能(解决办法同删除,或者通过建立一个新视图解决)
4,更改列类型
  oracle :alter table test modify column (mail2 integer);
  mysql :alter table test modify column mail2 integer;
  db2 :alter table test alter mail varchar(256) 只可以加宽,不能更改类型
5,更改列的限制(主键、非空)
  db2 :alter table test alter mail null/not null;
  mysql :alter table test modify mail2 varchar(29) not null;
  oracle:alter table test modify mail2 null/not null;

总结来说,目前oracle还是主流,其次是mysql再然后是db2和sqlserver。

数据库锁

锁分为乐观锁和悲观锁,乐观锁(Optimistic Concurrency Control)缩写为OCC,从字面意义上理解,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。相对于悲观锁,乐观锁在处理数据库时,不会使用数据库提供的锁机制,实现乐观锁的的方式之一就是记录数据版本。比如:

update tables 

set status=2,version=version+1

where id=#{id} and version=#{version};这里的version就是数据版本号,如果数据版本号相同就更新,否则就不更新。

 悲观锁(Pessimistic Concurrency Control)缩写为PCC。从字面意义上理解,就是每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会进入阻塞状态,直到它拿到锁。悲观锁又分为共享锁和排他锁。共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一把门,拥有多个钥匙一样,在执行语句后面加上lock in share mode就代表对某些资源加上了共享锁。排它锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。与共享锁类似,在需要执行的语句后面加上for update就可以了。还有像行锁,由字面意思理解,就是给某一行加上锁,也就是一条记录加上锁。表锁,给这个表加上锁。对于数据库而言,如果在对自增id进行增长操作时,它默认是表锁,如果操作的记录不存在默认也是表锁,如果存在那条记录那就是行锁,如果对连续的id记录操作那就是范围锁。在执行查询操作时默认不加锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet-W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值