文章目录
- 🐒个人主页:信计2102罗铠威
- 🏅JavaEE系列专栏
- 📖前言:
- 🎀 MySQL架构
- 🐕数据库引擎
- 🐕 InnoDB存储存储引擎
- 🐕MYISAM
- 🏨索引
- 🐕哪些情况需要创建索引?
- 🐕哪些情况不要创建索引
- 🐕索引的分类
- 🪀组合索引的最左前缀原则
- 🐕 索引的数据结构(为什么使用到B+树?)
- 🐕聚簇索引和非聚簇索引
- 🏨事务的特性ACID
- 🦓事务的隔离级别
- 🪀事务的实现原理
- 🪀隔离级别的实现原理 MV CC (多版本并发控制 Multi-Version Concurrent Control)
- 🪀数据库中的锁
- 🎀SQL优化
🐒个人主页:信计2102罗铠威
🏅JavaEE系列专栏
📖前言:
本篇博客主要总结MySQL数据库面试中常问的考察点
🎀 MySQL架构
大致可以分为四层:
- 连接层: 负责接收客户端的连接服务请求、进行授权认证
- 服务层: 接收SQL语句,对SQL进行解析、优化、缓存,使用触发器,存储过程,函数,DML,DDL语句
- 引擎层 :是真正具体实现的数据存储方式,不同的存储引擎特点不同
- 物理文件存储层: 使用各种文件用来存储数据 ,以及各种日志文件。例如undo.log 、redo.log 文件
🐕数据库引擎
🐕 InnoDB存储存储引擎
支持事务,行级锁(并发量大),有外键约束,支持全文索引,支持缓存,
支持主键自增,容量大。不存储表的总行数,需要sql逐行统计
🐕MYISAM
不支持事务,不支持外键,不支持行锁,只有表锁(并发量小),表空间小。
支持全文索引,存储了表的总行数,统计速度快。适合查询多。增删改较少的场景。
🏨索引
是类似于字典的目录索引
,可以快速定位数据真实的位置,是排好序的,方便快速查找的数据结构(B+树)
优点:可快速定位数据的位置,减少磁盘I/O的次数,可以通过索引列进行分组、排序、查询,提高了查询效率。
缺点:索引需要额外的存储空间,每次修改数据还需要维护更新索引树,需要消耗时间。
🐕哪些情况需要创建索引?
- 主键会自动创建索引
- 频繁作为查询条件的列
- 查询中与其他表关联的列,外键需要创建
- 查询在排序的列,(若建立索引将等待提高排序速度)
- 分组中的字段
🐕哪些情况不要创建索引
- 列中出现很多重复值
- 表记录太少
- 经常进行增删改的表不建议(需要频繁维护索引树)
- 经常不作为查询条件的字段
🐕索引的分类
🪀组合索引的最左前缀原则
列如表中有 a,b,c 3 列,组合索引(a,b),非索引列c ,筛选条件必须包含左边第一列a,否则索引不生效
select * from table where a=’’and b=’’索引生效
select * from table where b=’’and a=’’索引生效
select * from table where a=’’and c=’’索引生效
select * from table where b=’’and c=’’索引不生效
🐕 索引的数据结构(为什么使用到B+树?)
由于要存储很多数据并要求尽可能少的查询次数,所以选择树 的数据结构。
如果是二叉树,高度还是有点高,所以使用多叉树
但是添加数据可能会出现不平衡的情况,左子树为空,右子树很多数据。所以使用自平衡的多路查找树 B-树。
MySQL又根据经常范围查询、和性能上的改进,将B-树,改进成B+树.
B-树是每个节点都存储数据,高度是平衡的。
B+树是非叶子节点只存储索引,真实的数据存储在叶子节点上,并且叶子节点维护了一个双向链表,支持范围查询。
🐕聚簇索引和非聚簇索引
主要看是否可以直接找到,是否需要回表查询。
聚簇索引:找到了索引,就找到了数据。Innodb中主键索引(一级索引)。
非聚簇索引 Innodb中也存在非聚簇索引,二级索引(除主键外的列)会2先找到主键,再根据主键来找到数据。
数据库事务:在一次执行中,可能包含了多条sql语句,这些指令必须同时提交成功,或者失败回滚。不允许其他线程或事务进行干扰。MYISAM不支持事务,只有Innodb引擎才支持事务。
🏨事务的特性ACID
原子性:不可分割,一气呵成,不受其他事务干扰
隔离性:事务具有独立性,允许多个并发事务同时对数据进行读写的能力(读未提交,读已提交,可重复读,串行化)
持久性:事务一旦提交,将记录在硬盘上做到永久性保存。
一致性:数据经过多次操作,结果与预期相符,保证数据完整性。
🦓事务的隔离级别
就是对数据共享的开放程度
“读未提交”:一个事务可以读取到另一个事务未提交的修改。
缺陷:会造成脏读、幻读、不可重复读问题。解决办法:改成“读已提交”
“读已提交”:B事务读到了A事务已经提交的事务。解决了“脏读”问题
缺陷:仍然有“幻读”、不可重复读问题
“可重复读”:(默认隔离级别)B事务在开启后的两次查询中,两次查询结果是相同的,解决了“不可重复读”
缺陷:还有“幻读”问题
“串行化”:只有一个事务操作,加锁了,哪怕是查询操作也得等,解决一切问题,但效率最低。
🪀事务的实现原理
原子性和隔离性 :依靠undo log(回滚日志)保存每次操作的反向操作,实现回滚的
例如:我们执行insert语句,undo log日志中保存对应的delete语句
持久性:每当执行修改数据的操作时,先会将语句保存到redo log(重做日志)中,即使突然断电,正常后也可以从redo log日志中恢复数据
🪀隔离级别的实现原理 MV CC (多版本并发控制 Multi-Version Concurrent Control)
对于 “读已提交”:在同一个事务中实时访问到最新的数据,每次读时,都会给最新的版本链拍照,所以读到的数据是最新的
对于 “可重复读”:在一个事务中,第一次查询的结果与第二次查询的结果保持一致,在第一次查询的时候,会给当前版本链拍个数据快照,下次查询时,找到当初的版本链读数据。
使用隔离级别机制,为了实现并发的读写、写读,来提高并发效率
🪀数据库中的锁
按锁的粒度划分:行锁、间隙锁、表锁
行锁:Innodb引擎默认,对一行加锁,锁冲突概率低,并发度高
间隙锁:对某一区间加锁,区间可不连续
表锁:MYISAM引擎默认,对整个表加锁,锁冲突概率高,并发度低
按锁的工作状态划分:共享锁(读锁)、排他锁(写锁)
🎀SQL优化