导图社区 Mysql 数据库知识图谱
该图谱囊括了mysql关键的知识点,包括事务、MVCC、锁等核心内容。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
mysql
执行顺序
连接管理
客户端账户认证、安全校验等
查询缓存
判断是否命中缓存
语法分析
判断sql语句是否符合规范
语法优化
对sql语句做一些简单优化
搜索引擎
InnoDB
1、支持表锁、行锁
2、支持事务
3、支持B+树索引
意味着聚簇索引不需要回表,二级索引才需要回表查询
MyIsam
1、只支持表锁
2、不支持事务
3、支持全文索引
意味着不支持聚簇索引,只支持二级索引,所有搜索都需要回表查询
Memory
暂不了解
索引原理
聚簇索引
聚簇索引指的是根据主键排序建立起来的B+树结构
聚簇索引包含数据表所有字段(数据即索引,索引即数据)
聚簇索引查询出的数据不需要回表操作
二级索引
二级索引是指根据表中某个非主键字段排序建立起的B+树结构
二级索引查询出的结果集如果存在非索引字段,则需要回表拿到完整数据
联合索引
联合索引是指根据表中多个字段排序建立起来的B+树结构
联合索引排序顺序是按照字段顺序进行
1、先根据第一个字段进行排序
2、第一个字段出现重复值则按照第二个字段进行排序,以此类推
索引优化
1、尽量使用主键索引(聚簇索引),降低回表提升性能
2、尽量不要使用now/sum等原生方法,会导致索引失效
3、where子句、order子句,group子句尽量加上索引
4、使用最终结果作为查询条件,而非使用表达式
5、查询频率较高字段尽量加上索引
6、尽量使用覆盖索引提升效率
覆盖索引是指非主键索引情况下,索引内容包含所有目标数据,减少回表
缓存
Mysql 8.0官方不推荐使用缓存
待补充
事务
事务特性
原子性
事务包含的所有操作要么全部成功要么全部失败
一致性
事务执行失败,所有操作的数据都需要回滚
隔离性
事务执行过程中获取到的数据要么是别的事务修改之前的,要么是修改之后的数据
持久性
事务执行过程中所作的修改一旦提交,那么对于数据的修改不会因为服务重启等因素丢失
事务传播
不属于数据库特性,仅做知识归类
并发问题
脏写
脏写是指事务并发执行情况下,出现一个事务的修改被另外事务覆盖的情况
脏读
脏读是指事务并发执行情况下,读取到另外事务修改但未提交的数据
不可重复读
不可重复读是指同一个事务在俩次间隔查询获取的结果集不一样的情况
幻读
幻读是指同一个事务在俩次间隔查询情况下读取到之前一次未读取到的记录的情况,强调出现新记录
隔离级别
未提交读
1、可以读取到别的事务未提交的修改内容
2、会出现脏读、不可重复读、幻读问题
已提交读
1、只能读取到已提交的事务内容
2、会出现不可重复读、幻读问题
可重复读
1、只能读取到当前事务开始后的其他事务已提交的内容
2、会出现幻读问题
3、原则上该隔离级别已经解决了幻读问题,为mysql默认隔离级别
可串行化
1、所有事务串行执行
2、不会出现脏读、不可重复读、幻读等问题
3、由于该隔离级别所有事务是串行执行,所以安全性最好,效率最低
MVCC原理
MVCC(多版本并发控制)本质是就是为了解决多事务场景下的读写,写读操作能够并发执行
由于事务id是递增分配,在数据库操作过程中,通过事务id可以形成一个版本链
在已提交读和可重复读隔离级别下,会生成一个ReadView用来区分当前版本是否可见
ReadView包含当前活跃事务id列表,也就是当前未提交事务列表,然后跟生成ReadVidew的事务id进行比较,来判断该版本记录是否可见
已提交读是在每一次执行查询时都会生成一个最新的ReadView,来判断事务是否可见
可重复读是在第一次执行查询是生成一个ReadView,在同一个事务范围内的多次查询会复用这个ReadView,来判断记录是否可见
mysql 通过并发版本控制,在可重复读隔离级别下就已经解决了幻读问题
解决逻辑
已提交读和可重复读隔离级别下,查询默认是使用MVCC进行
通过MVCC进行读取的方式也叫一致性读、一致性无锁读
锁
加锁
加锁本质上就是维护一个获取锁状态为成功,并绑定相应事务id
加锁方式相当于让事务串行化执行
解锁
当前获取到锁的事务提交后,锁结构会被销毁
销毁锁事会查看是否有事务处于等待状态,如果存在就将其设置为获取锁成功状态,并唤醒线程
多粒度锁
行锁
锁住某单条记录
InnoDB引擎支持,MyIsam引擎不支持
表锁
锁住整张表的所有记录
间隙锁
多类型锁
共享锁(S)
事务读取一条记录时需要先获取到该记录的共享锁
共享锁可以同时被多个事务持有
共享锁属于行锁
排它锁(X)
事务修改一条记录数据时需要先获取该记录的排它锁
排它锁只能同时被一个事务持有
排它锁属于行锁
意向共享锁(IS)
意向共享锁属于表锁
意向共享锁是用来表明该表中存在共享锁
意向排它锁(IX)
意向排它锁属于表锁
意向排它锁是用来表明该表中存在排它锁
锁兼容情况
分表分库
集群
主从复制
读写分离
其他
慢查询问题