
吊打面试官系列——万字长文MySQL篇面试题总结(三)
前言
本文包含索引、查询优化、事务、主从复制、Innodb特性、分库分表等面试问题,以及相关参考文章,祝您顺利吊打面试官~
**本合集归于: 吊打面试官系列

执行一条语句的过程介绍一下?
-
应用服务器与数据库服务器建立一个连接
-
数据库进程拿到请求sql
-
根据查询语句先查看缓存,如果命中,直接返回,否则进行语句解析
-
解析SQL语句,判断是否合法
-
如果合法,由优化器将SQL语句转化为执行计划进行执行
-
读取数据到内存并进行逻辑处理
-
通过步骤一的连接,发送结果到客户端
-
关掉连接,释放资源
大表数据查询,怎么优化?
-
在查询语句中必须加上范围限定条件
-
优化SQL语句和索引
-
加缓存,redis
-
主从复制,读写分离
-
垂直拆分,将大的数据表分成多个数据表
-
简单来说是数据表列的拆分
-
优点:行数据变小,能够减少读取的IO数
-
缺点:出现冗余主键,需要管理冗余列,而且需要多表关联查询
-
-
水平拆分,将数据量大的数据表拆分
-
表的行数超过200万行性能会下降
-
最好结合分库使用,将数据分到别的机器
-
分片方案:客户端代理,分片逻辑在应用端;中间件代理,在应用与数据间加了一层代理层,分片逻辑维护在中间件,如Mycat。
-
MySQL组件以及SQL语句执行介绍一下?
参考文章:
https://www.jianshu.com/p/5b60de98332b
-
整体分为server层和存储引擎
-
server层用来存放通用组件,存储引擎则是负责具体的数据操作,提供读写接口
-
连接器
-
管理着连接的创建,维持和管理以及权限验证
-
建立的连接会使用一开始查询到的权限
-
-
查询缓存
-
查询语句会先来查询缓存
-
查询语句为key,结果为value
-
8.0已经删除,因为缓存很容易失效
-
-
分析器
-
分析查询语句。
-
分析语法是否正确,识别表名,字段名等
-
-
优化器
-
确定SQL的执行计划
-
包括索引的选择、多表关联还会涉及基准表的选择(内连接有优化器选择哪个为基准表,一般选数据较少的为基准表,因为要全表搜索)
-
-
执行器
-
SQL语句要操作的表可能不止表面上的,比如说触发器,得在执行器阶段才能确定
-
先校验是否有足够的权限
-
然后会打开表,根据表的存储引擎去使用存储引擎的接口
-
如果匹配到目标数据行就进行返回
-
分库分表后会有什么问题?
-
分布式事务
- 分库分表后的事务变成了分布式事务
-
跨库join
-
跨节点连接,比较合适的解决方法是分两次查询
-
第一次查询得到关联数据的id,第二次根据得到的id请求关联数据
-
-
跨节点的聚合函数
- 分别在各个节点上得到结果后在应用程序段进行合并
-
数据迁移,容量规划,扩容
-
ID问题
-
UUID:非常长,占用空间大,没有自增性导致索引性能不足
-
分布式自增ID算法Snowflake:全局自增ID
-
数据库结构优化方法有哪些?
-
将字段很多的表分解成多个表
- 对于使用频率较低的字段,可以将这些字段分离出来形成新的表
-
增加中间表
- 对于经常使用联合查询的表,可以建立一个中间表将需要联合查询的数据插入到中间表,以后的查询可以直接查询中间表,避免联合查询
-
增加冗余字段
-
适当的添加冗余字段可以有效地提高查询速度
-
但是当冗余字段的值修改了,需要注意修改其它的表来保证数据一致性
-
MySQL数据库cpu飙升到500%的话如何进行处理?
-
首先调用top命令,查看是否是mysql造成的
-
如果是,则调用show processlist看看里面跑的 session 情况,是否有消耗资源的 sql 在运行