数据库学习(sql)----一些理论

     最近打算学习学习数据库,包括查询优化。本来打算弄oracle开始玩。 因为公司用的是oracle。可是 发现 折腾不起来。很多基础的不懂。装了半天好不容装起来了。都不会建立数据库什么的。 想想 先搞mysql玩玩。之后再说。于是装上mysql下了点资料开始学习。 

首先打算 好好了解一下它的机制。 

隔离

首先 sql 规范有四种隔离级别。

1.red uncommited (读取未提交内容) :事务未提交也能读

2.red commited(读取提交内容) :读取提交后的内容。 绝大部分数据库默认用这个。

3. repeatable read(可重复读):mysql 默认用这个。

4.serializable(串行化):最安全也是最耗性能的。所有事务是排序进行的。一个执行完了才能下一个。

隔离级别脏读可能不可重复读可能幻读可能加锁读
red uncommited
red commited
 repeatable read
serializable


事务

对于事务。需要注意的是非事务表的存在。有些表示非事务表。如:InnoDB表和MyISAM表。如果在事务中处理了事务表和非事务表。然后出错回滚。非事务表将不会回滚。

有时候会有一个警告提示。而绝大部分不会有任何提示。

锁分显示锁和隐式锁。一般的对于数据的操作。都是隐式锁。不过可以通过语句显示加锁。如:

select ........lock in share mode;

select ...... for update;

等等。


并发控制

数据库对于数据的处理不是简单的加锁处理的。是通过一种“mvcc(多版本并发控制)”来处理的。 各个数据库对于mvcc的实现是不同。

利用InnoDB模式下的简化mvcc举例说明一下

InnoDB 通过为每个数据行添加两个隐含值来实现mvcc。这两个值记录着行的创建时间和过期时间(删除时间)。每一行都记录着事件发生时的系统版本号,用来替代时间发生的实际时间。每一次 开始一个事务。都会吧系统版本号递增。每个事务都会保存他在开始时候的“当前系统版本”的记录。而每个查询都会根据事务的版本号,检查每行数据的版本号。下面看下隔离级别为 repeatable read的时候、mvcc在实际操作中的应用方式。

select

检查每行数据。确保符合2点

1.只查找版本号小于或者等于当前版本号的。(小于版本说明是之未改变的。等于说明是这个事务创建的)

2.确保删除版本是未定义的或者大于事务版本的。(未定义说明没被删除。大于版本说明是被之后的其他事务删除的。)

intsert

创建行 赋予当前版本号

delete

将删除删除版本号设置为当前版本号

update

1。将删除删除版本号设置为当前版本号

2。拷贝旧行。更新值。设置创建版本号。

这样 很明显。缺点就是有额外的记录行。(这些记录行肯定有妥善的方法清理。我不懂怎么处理。)好处就是不必加锁。

mvcc模式只在red commited 和repeatable read隔离级别下有效。 red uncommited级别永远读取最新的。而serializable是加锁的。

总结一下各种加锁策略性能以及引擎支持:

加锁策略并发系统开销引擎
表级加锁最低最低MyISAM、merge、memory
行级加锁NDB Cluster
MVCC最高最高InnoDB、Falcon、PBXT、solidDB

通过命令 show table status like ‘user’ 可以获得user表的信息 包括引擎

MyISAM

MyISAM引擎是mysql默认引擎。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值