mysql 精通

mysql 的一些知识点。。。

大厂面试问题

存储引擎的InnoDB 与 MyISAM 的区别 优缺点 使用场景?

Mysql 的优化之道

UndoLog 和 RedoLog 的区别和联系

mysql 索引的数据结构是什么 为什么使用这种数据结构

索引失效的场景有哪些

什么是死锁和死锁的排查和解决

RC 和RR 的实现原理及区别和使用场景

分库与分表带来的分布式困境和应对之策

InnoDB 和 MyISAM 区别

MyISAM :高速引擎,拥有较高的擦汗如,查询速度,但不支持事务,不支持行锁,支持
3种不同的存储格式。包括静态型,动态型和压缩型
InnoDB: 5.5版本后mysql默认,支持事务和行级锁定,事务处理,回滚,崩溃修复能力和多版本并发控制的事务安全,比MyISAM处理速度稍慢,支持外键

使用场景

MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。

InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且行锁定的机会比较大的情况。

mysql 的流程

connection pool -> sql interface (SQL 接口 用于接收sql DML DDL)-> parser(解析器 词法分析和语法分析) -> optimizer(查询优化器) -> caches & bufffers(查询缓存) ->存储引擎

索引分类

  1. 单列索引
  2. 组合索引

非聚集索引(MyISAM)
索引和数据是分开文件的
在索引里面找到数据 的地址 再通过地址找到具体的数据

聚集索引(InnoDB)
主键索引 叶子节点有全部数据
辅助索引 叶子节点是主键的ID

回表:查询了两个索引树
索引覆盖 组合索引

行锁
行读锁 LOCK IN SHARE MODE
行读锁升级为表锁
行写锁 FOR UPDATE
间隙锁 主要是在 RR(MySQL 默认RR) 隔离级别下 有一个快照 因为会出现幻读所以 锁定一个范围
next key 锁 行写锁+间隙锁
死锁

InnoDB 内存结构

buffer pool 缓冲池
Redo log Bufffer 重做日志缓存
redo log 写入成功则 commit 成功
重做日志落盘机制
0-- commit 后 每隔固定时间 写入 os buffer 并刷新到磁盘
1–commit 后 写入缓存并刷新到磁盘
2–commit 写入缓存 每隔固定时间刷新到磁盘

落盘后 会清掉redo log
check point 检查点 落盘的时机
double write 双写 写入到两个地方 共享表空间 和数据文件 避免操作缓存带来的写的问题 数据的可靠性

事务的隔离性

脏读 所有事务都可以看到其他未提交事务的执行结果
不可重复读 同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致
幻读 当事物A查询某一范围的数据时,另一个事务B又在该范围内插入了新行并作了提交,此时事物A看不到新行,却在新行做了更新操作,此时事物A再查询会看到新行,就想产生了幻觉一样。
1
MVCC特性,可以避免脏读、非重复读
next-key lock 避免幻读

脏读:设想⼀个事务已经将⼀些数据写⼊数据库,但事务还没有提交或中⽌。另⼀个事务可以看到未提交的数
据吗?如果是的话,那就叫做脏读
防止脏读原因:
如果事务需要更新多个对象,脏读取意味着另⼀个事务可能会只看到⼀部分更新。例如,在图7-2
中,⽤户看到新的未读电⼦邮件,但看不到更新的计数器。这就是电⼦邮件的脏读。看到处于部分
更新状态的数据库会让⽤户感到困惑,并可能导致其他事务做出错误的决定。
如果事务中⽌,则所有写⼊操作都需要回滚。如果数据库允许脏读,那就意味着
⼀个事务可能会看到稍后需要回滚的数据,即从未实际提交给数据库的数据。想想后果就让⼈头大

后⾯的写⼊会覆盖⼀个尚未提交
的值?这被称作脏写

在这里插入图片描述

爱丽丝在银⾏有1000美元的储蓄,分为两个账户,每个500美元。现在⼀笔事务从她的⼀个账户中转移
了100美元到另⼀个账户。如果她在事务处理的同时查看其账户余额列表,不幸地在转账事务完成前看
到收款账户余额(余额为500美元),⽽在转账完成后看到另⼀个转出账户(已经转出100美元,余额
400美元)。对爱丽丝来说,现在她的账户似乎只有900美元——看起来100美元已经消失了。
这种异常被称为不可重复读(nonrepeatable read)或读取偏差(read skew):如果Alice在事务结
束时再次读取账户1的余额,她将看到与她之前的查询中看到的不同的值(600美元)。在读已提交的隔
离条件下,不可重复读被认为是可接受的:Alice看到的帐户余额时确实在阅读时已经提交了

快照隔离是⼀个有⽤的隔离级别,特别对于只读事务⽽⾔。但是,许多数据库实现了它,却⽤不同的名
字来称呼。在Oracle中称为可序列化(Serializable)的,在PostgreSQL和MySQL中称为可重复读

⼀个事务中的写⼊改变另⼀个事务的搜索查询的结果,被称为幻读(详情见网上例子)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值