Mysql,InnoDB,MVCC

概述

关系型数据库

关系型数据库,是指采用了关系模型来组织数据的数据库。 简单来说,就是采用二维表来存储。
常见的有:MySql,Oracle,SQLServer,DB2

非关系型数据库

NoSQL:Not Only SQL
非关系型数据库主要是基于“非关系模型”的数据库。
常见的有:
在这里插入图片描述

存储引擎

InnoDB

支持事物,基于行锁,采用聚簇索引。存储文件为frm+ibd,frm文件用于存储表结构,字段等信息,ibd存储索引和数据。MySql 5.6以上默认存储引擎。

MyISAM

不支持事物,基于表锁,采用非聚簇索引。存储文件为frm+myi+myd,frm文件用于存储表结构,字段等信息,myi存储索引信息,myd存储数据。

底层结构

索引:排好序的数据结构,排好序即底层的数据页中每个数据都是按照primary key的顺序排列,数据结构为B+树。

InnoDB
在这里插入图片描述
在这里插入图片描述
MyISAM
在这里插入图片描述

事物

  1. 原子性
    一个事物中的操作要么全部执行,要么全部不执行。
  2. 一致性
    数据库只能从一个一致性状态到另一个一致性状态。
  3. 隔离性
    一个事物的执行不能影响另一个事物所干扰。
  4. 持久性
    事物一旦提交,对数据库的修改将是永久的。

隔离级别

  • read uncommitted
    读未提交,事物可以读到另一个事物未提交的数据。会产生幻读。
  • read committed
    读已提交,事物读到另一个事物提交的数据。造成两次读取结果不同,产生不可重复读。
  • repeatable read
    可重复读,这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
  • serializable
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

MVCC

多版本并发控制

版本链:对于InnoDB引擎,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,表中有主键或者非null的唯一键时都不会包含row_id列)。
trx_id:每次对某条记录进行改动时,都会把对应的事物id赋值给trx_id隐藏列。
roll_pointer:每次对某条记录进行修改时,隐藏列都会存一个指针,可以通过指针找到该记录修改前的信息。

ReadView
m_ids:表示在生成ReadView时当前系统中活跃的读写事物的id列表。
min_trx_id:表示在生成ReadView时当前系统中活跃的读写事物中最小的事物id,也就是m_ids中的最小值。
max_trx_id:表示生成ReadView时系统中应该分配给下一个事物的id值。
creator_trx_id:表示生成该ReadView的事物的事物id。
在这里插入图片描述

持久化

redo log:InnoDB中的。记录的是物理层面的数据页、偏移量。redo log在磁盘中也有一块存储区域redo log file,每次执行sql后,首先在log buffer中记录,再执行数据更新操作,再通过机制(下图)将redo log持久化到磁盘中的redo log;当log file0和log file1都满了以后,会触发checkpoint检查点,将内存中的脏页持久化到磁盘中,log file空间便可以得到清理继续写入数据。InnoDB持久化的三种方式如下,默认为1。
在这里插入图片描述
undo log:用来回滚行记录到某个版本。undo log一般是逻辑日志,sql语句,根据每行记录进行记录。

bin log:mysql中的。记录了逻辑上的概念,sql语句。主要跟数据库主从复制有关系。

在这里插入图片描述
当执行sql语句时,会先从磁盘中取出(复制)一页(16KB)的数据,结合free链表中的空闲页地址,放到Buffer Pool(InnoDB中默认128M,本质是一个数组),并将其加入LRU链表的冷数据区。执行某个更改操作的sql时,首先会写入redo log日志,然后再对buffer pool中的数据进行更改,并将其加入到flush链表。

  • Free 链表:记录Buffer Pool中的空闲区域。

  • Flush 链表:记录脏页。

  • LRU 链表:记录最近使用的页。分为热数据区域和冷数据区域,从数据库新取出(实质为复制)的页先放入冷数据区域,冷数据区域的页两次被访问的时间差大于1s时就会被加入热数据区域(头插)
    在这里插入图片描述

1. 按属性

  • 读锁:又称共享锁,S锁
  • 写锁:又称排他锁,X锁

select语句可以绕过锁,直接读取数据

加读锁:select … lock in share mode,将查找到的数据加上读锁,其他事物可以获取这些记录的读锁,不能获取写锁,会阻塞。
加写锁:select … for update,将查找到的数据加上写锁,其他事物不能获取读锁和写锁。

2. 按粒度

  • 行锁(InnoDB),表锁(MyISAM),页级锁,记录锁,间隙锁,临键锁

LOCK_REC_NOT_GAP:行锁;
LOCK_GAP:间隙锁,锁定一个范围,但不包括记录本身,GAP锁的目的是为了防止同一事物的两次当前读,出现幻读的情况;
LOCK_ORDINARY:锁定一个范围,并且锁定记录本身。对于行的查询,都是采用改方法,解决幻读的问题。

3. 锁的状态

  • 意向共享锁
  • 意向排他锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值