MySQL 数据库重要概念

2018-05-16  本文已影响0人  vckah

本文是阅读 《高性能 MySQL 》一书所做的基本学习笔记。

表锁

表锁是 MySQL 中最基本的锁策略,开销最小。它会锁定整张表,一个用户在对表进行写操作时,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时。其他读取用户才能获得锁,读锁之间不是相互阻塞。

行级锁

它可以最大程度地支持并发处理,同时也带来了最大的锁开销。它只在存储引擎层实现。它仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。

事务

事务是一组原子性的 SQL 查询。事务符合 ACID 概念。

隔离级别

事务的实现
事务的隔离性是通过锁实现的,而事务的原子性,一致性和持久性则是通过事务日志实现的。
事务日志又分为:redo log 和 undo log
redo :事务开启时,事务中的操作,都会写入到存储引擎的日志缓冲中,在事务提交之前,缓冲的日志提前刷新到磁盘上持久化,即“日志先行”。当事务提交后,数据文件才会刷新到磁盘。如果出现意外情况,那么可以根据 redo log 中的日志记录,将数据库恢复到前一个状态。未完成的事务,可以继续提交,也可以回滚。
undo log:主要为事务的回滚服务。事务除了记录 redo log,还会记录 undo log。undo log 记录了数据在每个操作前的状态。回滚就是根据它进行的。单个事务的回滚不会影响到其它事务。
redo log 保障的是事务的持久性和一致性,而undo log则保障了事务的原子性。

MVCC 多版本并发控制。不同的存储引擎 MVCC 的实现不同,典型有 乐观锁和悲观锁。InnoDB 是通过在每行记录后面保存两个隐藏的列来实现的。一个是行的创建时间,一个是行的过期时间,存储的不是实际时间,而是系统的版本号。每开始一个新事物,它会递增。具体如下操作:
select:
行的系统版本号小于或等于事务的系统版本号,确保事务读取的行,要么是在事务开始之前已经存在的,要么是事务自身修改的。还有行的删除版本号要么没有定义,要么大于事务版本号。
insert:
为每一行保存当前系统版本号
delete:
为删除的每一行保存当前系统号为删除标识
update:
为插入一行新纪录,保存当前系统版本号作为行版本号,保存当前系统号到原来的行作为删除标识。

死锁

多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,导致恶性循环的现象。

索引的三个优点

索引三星系统:

高效的索引策略

  1. 独立的列:查询中的列如果不是独立的,MySQL 不会。独立的列指的是索引列不能是表达式的一部分,也不能是函数的参数
  2. 前缀索引和索引选择性
  1. 选择合适的索引列顺序
  2. 聚簇索引:并不是一种单独的索引类型,而是一种数据存储方式
  3. 覆盖索引:如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引
上一篇 下一篇

猜你喜欢

热点阅读