漫漫长路,其修远兮!
分类: Mysql/postgreSQL
2013-02-19 17:03:19
1.mysql逻辑架构图
服务器通过存储引擎API与引擎进行通讯,该接口隐藏了存储引擎直接的差别,使他们在查询层上是透明的。有哪些功能是在存储引擎层实现的?(事务,还有吗?)
2.连接管理与安全性
服务器有缓存线程,对应的线程缓存参数:
thread_cache_size:线程缓存的大小,通过比较show status like 'connections';来确定线程缓存的大小
thread_concurrency:并发线程的大小,一般是cpu核数的2倍
innodb_thread_concurrency:
3.并发控制
一句话,并发是通过锁和多版本控制来实现的。表锁直接在mysql服务器加,不用考虑存储引擎,锁的开销比较小,行级锁是存储引擎级别实现,开销最大,
在innodb和Falcon存储引擎中实现。
4.事务
原子性:undo log 实现
一致性
隔离性
持久性:redo log 实现
死锁是指两个和多个事务在同一资源上相互占用,并请求加锁时,而导致的恶性循环现象。
在mysql中如何检测死锁呢?
死锁不能够实时的监控到,innodb内部有一个循环依赖检测机制,实现对死锁的检测,不会等到timeout就返回,当死锁发生后可以通过
show engine innodb status, 查看LATEST DETECTED DEADLOCK
mysq5.5的版本可以看information_schema库中的Innodb_Locks
事务日志的作用
a.数据持久化,随机IO转变成顺序IO
b.数据合并写入
c.mvcc实现的基础
设置事务的隔离基本
set session transaction isolation level read committed
显式锁定
select .....lock in share mode
select......for update
lock tables
这些命令是有mysql服务器实现,而不是有存储引擎实现
5.多版本并发控制
mvcc可以看成是行锁的一种变形,它避免了很多情况下的加锁操作(主要是读取的操作),大大降低了系统开销
mvcc只能在repeatable read 和read committed两个隔离级别下生效。
innodb通过为每个数据行添加两个隐含值的方式来实现MVCC,这两个隐含值记录了行的创建时间,以及他的过期时间。每一行都存储了事件发生时的系统版本号,
没开始一个新的事务,版本号就会增加
6.create table t1 like table1,复制表的结构
create table t1 select a,b from table1 复制表的机构和数据
7.悲观锁和乐观
悲观锁:简单理解,就是每次在操作数据时总是悲观地认为会有别的事务也会来操纵同一数据,从此锁住该笔数据,直到自己操作完成后再解除锁
乐观锁:所谓乐观锁,它通常认为多个事务同时操纵同一数据的情况是很少的,因为根本不做数据库层次上的锁定,只是基于数据的版本标识实现应用程序级别上的锁定机制,既保证了多个事务的并发访问,又有效地防止了第二类丢失更新的出现