文章目录
- 前言
- DQL(数据查询语言)的执行顺序
- DML(数据修改语言)
- DDL(数据定义语言)
- 一条 SQL 是如何在 MySQL 中运行的 / 执行流程
- MySQL 中的函数
- 如何定位慢查询
- 如何优化或分析慢查询
- 什么是索引
- 在 MySQL 中可以适用 hash 索引吗
- 索引的底层数据结构 / 原理
- B 树和 B+ 树的区别(为什么用 B+ 树不用 B 树)
- 聚簇索引和非聚簇索引是什么
- 什么是回表查询
- 什么是索引覆盖
- MySQL 超大分页怎么处理
- 索引创建的原则
- 什么情况下索引会失效
- 谈谈SQL优化的经验
- 什么是事务
- 事务的特性是什么(面试必问)
- 隔离级别
- 并发事务带来的常见问题
- 如何解决并发事务带来的问题
- undo log 和 redo log 的区别
- 事务中的隔离性是如何保证的
- MySQL 中的幻读问题(RR 隔离级别)
- MySQL 的可重复读(RR 隔离级别)是怎么实现的
- MySQL 主从同步原理
- 分库分表
前言
数据库中我们开发生产中是必需的,而MySQL是大多数公司的首选关系型数据库,这一篇开始介绍MySQL相关的面试题,并且给出相应的回答。
DQL(数据查询语言)的执行顺序
- FROM
- WHERE
- GROUP BY (无法用到SELECT中的别名)
- HAVING
- SELECT
- ORDER BY (可以用到SELECT中的别名)
- LIMIT
DML(数据修改语言)
- INSERT INTO
- UPDATE,SET
- DELETE FROM
DDL(数据定义语言)
- CREATE TABLE / INDEX / DATABASE
- DROP TABLE / INDEX / DATABASE
- ALERT TABLE
- RENAME TABLE / DATABASE
一条 SQL 是如何在 MySQL 中运行的 / 执行流程
- 语法解析
- 语义分析
- 查询优化,根据SQL的复杂性,表索引等因素来生成一个执行计划
- 生成执行计划
- 执行查询
- 返回结果
MySQL 中的函数
常见多行函数:
- IF:相当于Java中的 IF ELSE
- CASE:相当于Java中的 IF ELSE IF … ELSE
- IFNULL:不为 NULL 返回第一个值,为 NULL 返回第二个值
- CONCAT:字符串连接函数
- IN:值得注意的是,IN 函数的参数个数是有限制的,大概在一百万左右
- DATE_FORMAT:日期格式化函数,注意日期格式是: %Y年 %m月 %d日 %H时 %i分 %s秒
- SUBSTRING:截取字符串
单行 / 分组 / 聚集函数:
- MAX
- MIN
- COUNT
- SUM
- AVG
如何定位慢查询
- 慢查询顾名思义,就是一条SQL执行的时间很长,所以它慢嘛,在面试中,我们应该结合相关的场景,讲出该场景中所涉及的接口,它在测试的时候响应的就很慢,后续我们排查到的原因就是慢查询
- 还可以讲在系统中当时采用了运维工具(Skywalking),这个工具可以检测出是哪个接口,因为它呈现的方式非常直观,以图表的方式给出,一眼就可以看出哪些是耗时的接口,再去排查SQL的问题
- 最后一个就是MySQL自带慢查询功能,MySQL在设计的时候就考虑到了这一点,非常的哇塞,我们开启这个功能也很简单,在配置文件my.ini(如果安装的时候不做特殊处理,配置文件的位置是固定的,直接在Linux中打开配置文件)中开启配置选项:
slow-query-log=1和long_query_time=2即可,前者是开启慢查询日志记录,后者是慢查询时间的阈值,超过这个时间的SQL,会被记录到慢查询日志文件中,后续进行排查即可,但一般在生产环境中不会开启该功能,因为会消耗一定的性能
如何优化或分析慢查询
采用MySQL自带的分析命令:explain 或 desc(两者功能相同)
- 通过查看key和key_len字段检查是否命中了索引(索引本身存在是否有失效的情况)
- 通过type字段查看sql是否有进一步的优化空间,是否存在全索引(索引树扫描) index 或全盘扫描 all
- 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

本文介绍了MySQL中的DQL、DML和DDL执行顺序,讲解了SQL的执行流程,重点讨论了索引的原理、类型以及优化方法,包括B+树和回表查询。还涵盖了慢查询的定位和优化,事务的特性、隔离级别以及并发问题。最后提到了MySQL主从同步和分库分表策略。
最低0.47元/天 解锁文章
1801

被折叠的 条评论
为什么被折叠?



