今日语录:“如果一个人一辈子只有一次翻身的机会,那就应该用尽全力才对”🌹
1、MySQL的架构你了解吗?
MySQL分为server层和存储引擎层。
- server层:负责建立连接、分析SQL以及执行SQL,包括了连接器、解析器、预处理器、优化器、执行器,还包括了所有的内置函数(日期函数等)以及跨存储引擎层的功能(视图等)。
- 存储引擎层:负责数据的存储以及提取。最常见的就是innoDB存储引擎。
2、执行一条select语句期间,发生了什么?⭐
建立连接:
- 如果在Linux下来操作,那么需要先和服务器基于TCP三次握手来建立连接,然后服务器验证用户名和密码,如果用户名和密码都正确,那么服务器会获取该用户所对应的权限,以后该用户所有的操作都是基于所拥有的权限来完成的。
查询缓存:
- 如果是查询语句,需要先到缓存中去查询数据,如果缓存命中,那么直接返回给客户端;未命中的话再继续往下执行
解析:
- 解析器主要做两件事情,对语句进行词法分析和语法分析。
- 词法分析:识别出语句中的关键字。
- 语法分析:检查该语句是否满足MySQL的语法要求。
预处理:
- 预处理器:检查语句中的表或者字段是否存在;将*扩展为所有列的列名
- 优化器:比如有多个索引,那么优化器会基于查询成本来选择成本最低的那个索引。
- 执行器:与存储引擎层进行交互,提取数据并返回给客户端。
3、数据库的三范式是什么?
- 第一范式:关系中的每一个分量不可再分。
- 第二范式:在第一范式的基础上,消除非主属性对键的传递依赖。
- 第三范式:在第二范式的基础上,消除非主属性对键的部份依赖。
4、什么是索引?索引有哪些分类?⭐
索引是帮助存储引擎快速获取数据的一种数据结构,相当于书的目录。
按照数据结构、物理存储、字段特性以及字段个数,索引可分为四类。
数据结构:
- B+树索引,哈希索引,full-text索引
物理存储:
- 主键索引:聚簇索引的叶子节点存放的是一条条实际数据
- 二级索引:其叶子节点存放的是主键值
在使用索引查询时,如果使用的是二级索引,且查询的数据在二级索引中能够查询到,那么就不需要回表,这个过程叫做索引覆盖;如果查询的数据再二级索引中查询不到,那么需要根据主键值再使用主键索引来进行查询,这个过程叫做回表。
字段特性:
- 主键索引:建立在主键字段上的索引
- 普通索引:建立在普通字段上的索引
字段个数:
- 联合索引:建立在多个列上的索引
- 单列索引:建立在单个列上的索引
5、什么时候需要/不需要创建索引?
需要:
- 字段有唯一性限制的,比如商品的编码
- 经常用于where查询的字段
- 经常用于group by和order by的字段
不需要:
- 字段中存在大量重复数据时
- 表中数据太少时
- 经常更新的字段
6、谈谈你对B+树的理解,和B树有什么区别?⭐
- B+树的叶子节点存放实际的数据,非叶子节点只存放索引
- B+树的叶子节点之间串成了一个有序链表
和B树的区别:
- 查询效率:B+树的非叶子节点只存放索引,B树的非叶子节点存放的是实际的数据,因此在数据存放量相同的情况下,B+树的层数会更少,也就意味磁盘I/O次数更少,查询效率更高
- 插入和删除效率:B+树有很多冗余节点,在进行插入和删除时基本上不影响非叶子节点;而B树没有那么多冗余节点,在进行插入和删除的时候有可能会导致树的复杂变化
- 范围查询:B+树的叶子节点之间构成了有序链表,这种设计对于范围查询很有帮助,而B树没有这种结构
7、索引失效的原因有哪些?⭐
- 对索引使用左或者左右模糊匹配
- 对索引使用函数
- 对索引使用表达式计算
- 建立的索引是字符串类型,输入参数是整型
- 联合索引未遵循最左匹配原则
- where子句中,or之前的列时索引列,or之后的不是
8、查询时,如何优化查询性能?
- 只返回必要的列:尽量避免使用 select *
- 只返回必要的行:使用 limit 来限制查询的行数
- 对经常查询的数据做缓存
9、innoDB和MyISAM的区别?
- 前者支持事务,后者不支持
- 对于count函数,前者在执行的时候会逐行扫描来进行统计;后者则会记录一个行数值,在查询的时候,直接将这个值返回
- 前者支持外键,后者不支持
- 前者支持行锁和表锁,后者仅支持行锁
10、谈谈你对水平切分和垂直切分的理解?
- 水平切分:是将一个表中的数据拆分到多个结构相同的表中,当表中数据太多的时候可以使用水平切分
- 垂直切分:将一个表中的列切分到不同的表中,切分的时候可以按照关系的密集程度切分,也可以把经常使用的列和不经常使用的列切分到不同表中
“后来雨声学会了弹钢琴,在黑夜诉说着,你不是一个人” 加油!
整理面经不易,小伙伴们点个赞吧~