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(查询缓存) ->存储引擎
索引分类
- 单列索引
- 组合索引
非聚集索引(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再查询会看到新行,就想产生了幻觉一样。
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中称为可重复读
⼀个事务中的写⼊改变另⼀个事务的搜索查询的结果,被称为幻读(详情见网上例子)