category
学习思考
date
Apr 24, 2023
icon
Origin
password
slug
mysql
status
Published
summary
记录面试中Mysql的高频问题
tags
Tags
type
Post
URL
1.如何定位慢查询?
可是使用数据库分析工具,也可以使用Mysql中自带的慢查询日志进行定位。可以在mysql中开启慢查询日志,并且设置sql查询时间超过多少定义为慢查询。推荐时间2s。
2.SQL语句执行很慢如何分析?
可以使用MYSQL自带的分析工具EXPLAIN进行分析。
- 通过key和key_len检查是否命中了索引
- 通过type字段查看sql是否有进一步优化空间,查看是进行了全索引扫描或者全盘扫描
- 通过extra判断是否存在回表情况,如果存在,通过添加索引或者修改返回字段来修复
3.什么是索引?
- 索引(index)是帮助mysql高效获取数据的数据结构
- 提高检索效率,降低IO成本(不需要全盘扫描)
- 通过索引对数据进行排序,降低CUP消耗
4.索引的底层数据结构了解过吗?
Mysql的InnoDB引擎默认采用B+树结构来存储索引
- 阶数更多,路径更短
- 磁盘读写代价B+数更低,非叶子结点只存在存储指针,不存储数据,叶子结点存储数据
- B+树有便于扫库或者区间查找,叶子结点是一个双向链表
5.什么是聚簇索引什么是非聚簇索引?
聚簇索引(聚集索引),数据与叶子结点保存到一块,叶子结点保存整行的数据,有且只有一个。
非聚簇索引(二级索引),数据与叶子结点分开保存,叶子结点只保存对应的主键,可以有多个。
6.什么是回表查询?
通过二级索引找到对应的主键,再去聚集索引中查找整行数据,就是回表查询。
7.什么是覆盖索引?
覆盖索引只查询使用了索引,返回的列必须在索引中全部能够找到
- 使用id查询,直接走聚簇索引,一次索引扫描,直接返回数据,性能高
- 如果返回的列中没有创建索引,可能会引发回表操作,尽量少使用select *
8.MySQL超大分页怎么处理?
问题:在数据量较大时,limit进行分页查询,需要对数据进行排序效率低。
解决方案:覆盖索引+子查询。先分页查询数据的id字段,确定id之后再用子查询过滤,只查询这个id表中的数据就可以了。因为查询id的时候走覆盖索引。所以效率可以提升很多。
9.索引创建原则有哪些?
- 数据量较大,且查询比较频繁的表需要创建索引(10w数据以上)
- 常作为查询条件,排序,分组的字段
- 尽量联合索引
- 控制索引的数量,因为增删改需要维护索引。
10.什么情况索引会失效?
- 违反了最左前缀法则
- 范围查询右边的列不能使用索引
- 在索引列上使用计算操作
- 字符串不加单引号可能导致索引失效(类型转换)
- 模糊查询可能导致索引失效 (%在前的情况)
11.谈一谈SQL优化的经验?
- 表的设计优化,数据类型的选择
- 索引优化,索引创建原则
- sql语句优化,避免索引失效,(避免select *、union all 代替 union 因为union有过滤操作、能用inner join 不用left或者right join,inner join自动以小表为驱动)
- 主从复制,读写分离,不让数据的写入影响读取
- 分库分表
12.什么是事物?
一组操作,不可分割,同时提交或撤销到系统,同时成功或者同时失败。
13.ACID是什么?
- A、原子性,不可分割的最小操作单元
- C、一致性,事物完成时,所有数据必须保持一致状态
- I、隔离性,数据库系统提高隔离机制,保证独立环境运行
- D、持久性,一旦提交或者回滚,改变就是永久的。
14.并发事物带来了哪些问题?MySQL默认的隔离级别是什么?
- 并发事物问题:脏读,不可重复读,幻读
- 隔离级别:读未提交,读已提交,可重复读,串行化




15.怎么解决并发事物问题?
对事物进行隔离

16.Undo log和Redo log的区别?
- redo log 记录数据页的物理变化,服务宕机用来同步数据,解决持久性问题
- undo log 记录的是逻辑日志,当事物会滚时,通过逆操作恢复原来的数据
- redo log保证了持久性,undo log保证了原子性和一致性
17.事物的隔离性是如何保证的?
MVCC是MySQL中的多版本并发控制。指维护一个数据的多个版本,使读写没有冲突
- 隐藏字段:trx_id 记录每一次失误操作ID,自增。roll_ptr(会滚指针),指向上一个版本的记录地址。
- undo log :会滚日志,存储老版本日志。版本链,根据roll_ptr形成会滚链表
- readView:解决的是一个事物查询选择版本的问题
18.MySQL的主从同步原理?


主从同步的核心是二进制日志(binlog日志),记录数据ddl语言和dml语言
1.主库将变更记录记录到binlog日志
2.从库通过读取binlog日志,记录到自己的中继日志
3.从库将中继日志反映到自己的数据
19.项目用过分库分表吗?

水平分库:将一个数据库的数据分摊到多个库,解决海量并发问题
水平分表:解决单表储存和性能问题
垂直分库:根据业务进行拆分,高并发下提高磁盘IO和网络连接数
垂直分表:冷热数据分离,多表互不影响。
水平分库和水平分表都需要使用中间件进行处理。
- 作者:LiuJixue
- 链接:https://liujixue.cn/article/mysql
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





