高性能Mysql 第一章MySQL 架构和历史

1、mysql逻辑架构

2、并发控制

2.1读写锁

分为两种类型的锁,一种叫排他锁(写锁),一种叫共享锁(读锁)。
写锁优先级最高,而读锁优先级最低;在队列中,有可能会出现写锁插队的情况,也就是优先写锁,在读锁

2.2锁粒度

在给定的资源上,锁定的数据量越少,那么处理并发的能力就越高,但是有很大的开销,对于行能有所损耗;
锁策略:就是在锁的开销和数据的安全性之间寻求平衡。

表锁

是mysql 最基本的锁策略,开销最小的策略,但是他会锁定这个表,在对表就行写操作(插入、更新、删除)时,都需要先获得锁,会阻塞其他用户的读操作,没有写锁时,才能获得读锁,读锁是共享锁。

行锁

行锁只能最大层度的支持并发处理,也就是说锁定的数据量是最小的,但是对系统的开销是最大的,行级锁只在存储引擎层实现了,但是在服务器层没有实现。

3、事务

一组SQL 操作。如果有一条sql 无法正常执行,则事务内的所有语句都不执行,也就是说,要么全部执行,要么全部不执行。
例:比如张三给李四转账200块
银行操作:

  • 张三账户内高于200
  • 扣除张三账户200
  • 李四账户增加200

如果在步骤2,或步骤3 之间系统突然崩溃,那么200块不知去向,显然是不正确的,所以这里要么一次成功,要么失败回滚

3.1事务特性

  • 原子性:要么全部执行,要么全部失败。
  • 一致性:数据只是从一个状态变到另一个状态 例子中的200 元从张三账户到李四账户。
  • 隔离性:每个事务在提交前,对于其他的事务来讲,是不可见的。
  • 持久性:事务一旦提交,所作的修改就会永久保存。

3.2事务隔级别

  • read unCommitted (未提交读)
    事务中的修改对于其他事务来讲,是可见的,也就是A事务可以读到B事务还没有提交的修改,也叫脏读
  • read committed (提交读)
    一个事务开始时,可以看到已经提交的事务的修改,也就是说,一个事务开始到结束时,做的修改,其他事务看不见;两次查询结果不一致,也叫不可重复读
  • repeaTable read(可重复读)
    一个事务在读取某个范围内的数据时,另一个事务又在该范围内插了一条数据,也叫幻读,这是mysql默认的隔离级别
  • serializable(串行化)
    就是每一个事务操作,都要在上一个事务操作之后才能进行。

3.3死锁以及解决方式

死锁产生情况:
事务A 在得到了S表的排他锁,再去获取N表的排他锁,刚好,N表的排他锁在事务B哪里,但是事务B也要获取事务A手上S表的排他锁才能释放N表的排他锁,这个时候就会产生死锁。
InnoDB死锁的两种解决方式:
1、当查询的时间达到锁等待超时时间的设定后放弃锁请求
2、将最少的排他锁的事务进行回滚

4、多版本并发控制

InnoDB的MVCC 处理方式:
在每行记录后面保存两条隐藏的列来实现的,一列保存了列的创建时间,一列保存了列的过期时间(或删除时间),但是不是具体的时间,而是版本号。MVCC 只在 可重复读(read committed),不可重复读(repeaTable read)下工作
查询:
1、InnoDB只查询版本早于当前事务版本的数据行
2、行的删除时间要么未定义,要么小于当前版本行
只有符合上两条结果,才会将其查询出来
插入:新插入的每一行保存当前系统版本号作为行版本号
修改:插入一条新纪录,保存当前系统版本号为行版本号,保存当前系统版本号作为原来行的删除标识
删除:删除的每一行保存当前系统版本号作为行删除标识

你可能感兴趣的:(高性能mysql,mysql,数据库)