程序员阿沛
发布于 2026-06-27 / 0 阅读
0
0

吊打面试官系列万字长文MySQL篇面试题总结三

吊打面试官系列——万字长文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 在运行


评论