high performance mysql-读书笔记1

一. Mysql架构

1. Mysql 逻辑架构

第一层   Connection/Threading  handling

↓                               ↓

Query cache         ←         Parser

第二层                                             ↓

Optimizer

Storage Engines

2. 连接管理

3. 优化与执行

4. 一致性控制

5. 读锁/写锁

6. 锁粒度

分为表级锁,行级锁

大部分数据库只给出一种选择行级锁,而mysql依据不同的存储引擎来决定自己的锁

7. 事务

ACID原则

Atomicity: 原子性,操作必须是原子是原子的 it’s all or nothing

Consistency: 一致性, 事务没有commit之前数据库crash。数据要保持一致

isolation: 隔离性,两个不同的事务操作同一数据。要保证在事务没有提交之前中间数据不会影响到另一个事务

druability: 持久性,事务一旦提交,将会永久的保存。

8. 隔离性

隔离性远比我们想像的复杂,标准的SQL定义了四个隔离级别, 指定了数据在事务内部及外部改变的可见性。

READ UNCOMMITTED: 事务可以读到事务已修改但未提交的记录,可能会产生脏读(dirty read)

READ COMMITTED: 事务只能读到其它事务已提交的记录。可能会产生不可重复读(nonrepeatable read)的问题

REPEATABLE READ: 同一事务中读取数据会是相同的。事务1执行过程中。事务2插入一行新记录。然而事务1需要range row的查询。会比之前多出记录。导致幻读(phantom read)

SERIALIZABLE: 序列化,所有的事务看起来像顺序执行一样。。。很少有用户采用这种方式

9. 死锁(DeadLock)

start transaction

update a set str=’123′ where id=3;

update a set str=’234′ where id=4;

commit

 

start transaction

update a set str=’123′ where id=4;

update a set str=’239′ where id=3;

commit

10. 事务日志

使用write ahead logging(预写式日志),原理是顺序写比随机写效率高

11. mysql中的事务

  • autocommit: 自动提交,mysql的默认设置,在非事务存储引擎中不起作用show variables like ‘%autocommit%';set autocommit=1
  • mixing storage engines in transactions: 如果在一个事务中混合使用事务/非事务的表。则在rollback中。非事务表不会起作用。通常会给出warning
  • innodb中使用two-phase locking,含义如下:在事务的任何阶段都可以获得锁,但直到commit或rollback时才会释放

两阶段封锁(Two-Phase Locking)
两段锁协议的内容

    1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
    2. 在释放一个封锁之后,事务不再获得任何其他封锁。

Innodb的锁是根据隔离等级透明实现的,但是它同样提供明确的锁:

SELECT ……… LOCK IN SHARE MODE

SELECT ……. FOR UPDATE

mysql在服务器层面实现了lock tables和unlock tables命令。

  • Multiversion Concurrency Control(多版本并发控制)

它可以避免不必要的行级锁,仅仅在有写操作的时候来锁定。