MySQL
2025-01-06 10:39:13 0 举报
AI智能生成
MySQL是一种流行的开源关系型数据库管理系统,由Oracle Corporation开发和维护。它使用SQL(结构化查询语言)来管理数据,广泛应用于各种规模的企业和个人项目中。MySQL支持大量的操作系统和编程语言,具有强大的性能和可扩展性,是网站和应用程序开发的理想选择。
作者其他创作
大纲/内容
链接
https://miaad3frj2o.feishu.cn/docx/SOTgdCbdGoxz4RxodaFcJ36snYM
语法层面
join原理
底层:小表驱动大表
内外连接区别?
架构和引擎层面
执行一条sql发生什么?
数据库表放在哪?
innodb表结构空间?
关于varchr
varchar和char区别
varchar如何保存的
varchar(n)的最大值多少?
Null如何保存的
索引
什么是索引?结构?
为什么用b+树?和b树红黑树区别?
记:叶子存记录,非叶子存索引,叶子节点用链表接上
好处:非叶子节点不存数据可以存储更多的索引,和避免树的合并和分裂,用链表接上叶子节点可以避免多次遍历树
堆表和索引组织表的区别?
应用场景
索引失效
索引分类
索引跳跃
order by 排序时候的算法
是否走索引?
索引何时创建?
什么时候需要创建索引?
什么收不需要创建索引?
事务
事务并发会产生什么问题?都是如何解决的
脏读
读取了另一个事务未提交的数据
脏读通过读已提交解决RC
原理:读不加锁,写操作加排他锁
不可重复读
多次读取同一行数据结果不一样
通过可重复读解决RR
原理:Mvcc实现,事务开始时的第一次查询创建快照,之后的其他查询都用这个快照
幻读
两次执行查询时返回的结果不一样
通过串行化解决
原理:使用锁,读加共享锁,写加排他锁,串行执行
MVCC
什么是MVCC?
多版本并发控制,指每个事务在读取数据时,可以看到一个一致性快照,而不会被其他事务的并发修改所干扰
解决了什么问题?彻底解决了嘛?
解决了快照读语意下的幻读问题,但对于先当前读在进行快照读的场景无法解决幻读问题。因为版本链被更新了
如何实现的?
通过截取快照获得的事务id与行数据的事务id比对,如果比最小的的事务id小则可读,比最大的大则不可读,在活跃事务列表里的也不可读,因为还未提交,读不到的版本链回溯直到可读
MySQL默认隔离级别
可重复读隔离级别。
事务的隔离级别有哪些?都是如何实现的
原子性A
事务是一个不可分割的工作单元,事务中的操作要么都发生要么都不发生
依靠undolog,可使用rollback回滚到之前的状态
一致性C
事务前后数据完整性一致
依靠其他三个特性
隔离性I
一个事务不能被另一个事务操作的数据所干扰
通过锁机制实现,和mvcc的快照读
持久性D
事务一旦被提交,改变就是永久性的
redolog实现,redolog在事务提交时刷盘
锁
有哪些锁?
按引擎分
Mysiam
只有表锁
innodb
有行锁和表锁
表锁
按读写分
读锁(共享锁)
用户读取时加的锁,其他用户不可以修改,但可以读取
写锁(排他锁)
用户增删改的锁,其他用户不可读也不可改
行锁
显式隐式分
显式
SELECT 语句 FOR UPDATE | LOCK IN SHARE MODE
隐式
通过索引,做增删改的时候隐式上锁
隔离级别分
RC:只有普通记录锁
RR
记录锁
锁一条记录
间隙锁
锁范围,不包含记录本身
临键锁
锁范围,包含记录本身
行锁锁的是索引 ,所以先看有没有索引,有索引则是行锁,没有索引则是表锁
锁的规则?
走不走索引?
不走索引?
那就锁全表,因为无法定位
走索引
是不是唯一索引?
是唯一索引
有数据,加行锁
没数据,加间隙锁
何时上表锁行锁?
行锁的话:通过索引检索数据或者手动加,否则使用表级锁
死锁
两种场景常见:
行锁导致的死锁
间隙锁导致的死锁
间隙锁之间并不冲突,但是和更新语句冲突,导致死锁
解决方案:降低隔离级别,不出现间隙锁,类似先读再写的场景,采用分布式锁,保证只有一个线程执行
乐观锁如何实现?
基本版本号和时间撮来实现,做更新前,先查询版本号,把要更新的版本放在where后面
日志
undo log(逻辑上保证回滚,强调保存前的值)
作用
事务回滚操作
增删改,对应回滚 ----> 删id ,记录删前的内容,更新旧值
配合mvcc做版本链
利用回滚指针和事务id,实现新数据向后追加,旧数据向前追溯
redo log(物理上防止宕机,强调保存后的值)
buff pool本质是缓存,掉电不可靠,所以先将redolog写入到redologbuff缓冲区,使得随机写变成顺序写,先将redolog持久化到磁盘,这样即使掉电也能恢复
刷盘策略:innodb_flush_log_at_trx_commit
0是事务提交不刷盘,系统默认一秒刷一次
1是提交刷盘
2是提交redologbuffer到pagecache中,刷不刷取决与os策略
bin log
格式
row
每一条更改sql的语句都会记录到bin log之中,但出现动态函数问题
statement
记录数据变化的前后状态
mix
结合两者
作用:主从复制,数据恢复
从服务器有个io线程读取主节点的binlog写到relaylog中,在开一个线程对relaylog进行重放
更新sql的执行流程
建立连接,sql解析和优化,加载缓存,更新脏页,更新undolog,更新bufferpool,然后事务俩个阶段提交
先将redolog进行一次预提交,在写binlog,然后redolog在commit
wal机制是什么?
刷盘前先写日志,只有日志写入成功才算事务提交成功
0 条评论
下一页