category
学习思考
date
Apr 24, 2023
icon
Origin
password
slug
mysql
status
Published
summary
记录面试中Mysql的高频问题
tags
Tags
type
Post

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默认的隔离级别是什么?

  • 并发事物问题:脏读,不可重复读,幻读
  • 隔离级别:读未提交,读已提交,可重复读,串行化
notion image
notion image
notion image
notion image

15.怎么解决并发事物问题?

对事物进行隔离
notion image

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的主从同步原理?

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

19.项目用过分库分表吗?

notion image
水平分库:将一个数据库的数据分摊到多个库,解决海量并发问题
水平分表:解决单表储存和性能问题
垂直分库:根据业务进行拆分,高并发下提高磁盘IO和网络连接数
垂直分表:冷热数据分离,多表互不影响。
水平分库和水平分表都需要使用中间件进行处理。
 
 
 
 
 
 
 
 
框架高频面试问题Redis-实战

  • Twikoo
  • Giscus