1 Star 0 Fork 0

heyifan/MarkDownNote

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Mysql.md 5.24 KB
一键复制 编辑 原始数据 按行查看 历史
yifan.he 提交于 2021-03-09 17:50 . update Mysql

MySql

存储引擎

InnoDB

  • 支持事务
  • 支持行级锁(共享锁,排它锁,意向锁),粒度小
  • 支持外键
  • 磁盘存储格式:.frm(表定义),.ibd(表索引和数据)
  • select查询相比较Myisam慢(innodb寻址要映射到块,再到行)
  • 支持聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

MyISAM

  • 不支持事务
  • 不支持行级锁,支持表级锁
  • 不支持外键
  • 磁盘存储格式:.frm(存储表定义) .myd(存储表数据) .myi(存储表索引)
  • 执行select查询速度比较快(记录的直接是文件的OFFSET,定位比INNODB要快)
  • 支持非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

四大隔离级别

Read UnCommit(读未提交):

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Commit(读已提交):

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeate Read(可重复读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过**多版本并发控制(MVCC,Multiversion Concurrency Control)**机制解决了该问题。

MVCC

即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能

在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段:

  • 6字节的事务ID(DB_TRX_ID )
  • 7字节的回滚指针(DB_ROLL_PTR)
  • 隐藏的ID

6字节的事物ID用来标识该行所述的事务,7字节的回滚指针需要了解下Innodb的事务模型。

事务在更新⼀条记录时会将其拷⻉⼀份⽣成这条记录的⼀个原始拷⻉,写操作同样还是会对原记录加锁,但是读操作会读取未加锁的新记录,即通过维持一个数据的多个版本,使得读写操作没有冲突,保证了读写并⾏。要注意的是,生成的新版本其实就是 undo log,它也是实现事务回滚的关键技术

begin->用排他锁锁定该行->记录redo log->记录undo log->修改当前行的值,写事务编号,回滚指针指向undo log中的修改前的行

快照读

像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

当前读

像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本.

快照读就是MVCC思想在MySQL的具体非阻塞读功能实现,整个MVCC多并发控制的目的就是为了实现读-写冲突不加锁,提高并发读写性能,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现.

Serializable Read串行化读

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

索引结构

索引失效场景

Sql优化

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/hyf216/mark-down-note.git
git@gitee.com:hyf216/mark-down-note.git
hyf216
mark-down-note
MarkDownNote
master

搜索帮助

Cb406eda 1850385 E526c682 1850385