文章
努力加载图片中...
MySQL 面试题学习
  • 7759 字

  • 10 分钟

  • 10 次

  • 2025-09-23
标签:

恶补一下 数据库的基本知识。首先明确一点:码 = 键

  1. 能够唯一标识一条记录的属性或者属性组
    • 例如唯一标识学生表的一条记录,可以通过学号、可以通过身份证号,或者学号+身份证号,那码就有学号、身份证号、学号+身份证号
  2. 候选码能够唯一标识一条记录的最小属性集
    • 上述的学生表中,学号+身份证号就不是最小属性集了,候选码就只能是:学号、身份证号
  3. 主码(主键)某个能够唯一标识一条记录的最小属性集
    • 其实就是从候选码中人为挑一个合适的。
  4. 主属性包含在任一候选码中的属性称主属性
    • 就是某一候选码所有属性的并集
  5. 非主属性不包含在候选码中的数据
  6. 外码(外键):子数据表中出现的父数据表的主键。我更倾向与:数据表中出现的另一数据表的主键
  7. 全码由所有属性共同构成的候选码
  8. 函数依赖如果属性 X 能够唯一确定 Y 的值,则说明 Y 函数依赖于 X

1 NOSQL和SQL的区别?

  • SQL 数据库就是关系型数据库,数据库存储在表格里,用固定结构和 SQL语言操作,强调一致性和关联查询。
  • NoSQL 数据库就是非关系型数据库,数据可以是键值、文档等结构,扩展灵活,并发性能好,适合非结构化的数据。

2 数据库的三大范式是什么?

  1. 第一范式(1NF):属性不可再分
  2. 第二范式(2NF):在 1NF 的基础上,消除非主属性对主码的部分函数依赖
    • 也就是如果主码是多个属性组成的,那么非主属性不能和主码的一部分属性相关,不然就得拆开。
    • 例如(订单号、产品号、产品数量、订单金额),订单号和产品号得是联合主键吧?但是产品数量是依赖于产品号、订单金额是依赖于订单号,这就不符合 2NF 了,得拆开。
  3. 第三范式(3NF):在 2NF 的基础上,消除了非主属性对于码的传递函数依赖
    • 也就是非主属性不能依赖于非主属性。
    • 例如(学号、姓名、班主任名、班主任性别),学号是主键吧?但是班主任性别是依赖于班主任名的,所以不符合 3NF ,得拆开。

3 MySQL 怎么连表查询

  1. 内连接(inner join)
  2. 左外连接(left join)
  3. 右外连接(right join)
  4. 全外连接(full join)

4 MySQL 如何避免插入重复的数据

  1. 字段使用 unique 约束。
  2. 使用 insert ... on duplicate key update
  3. 使用 insert ignore

5 Char 和 Varchar 有什么区别

  • Char 是固定长度的字符串类型,定义时需要指定固定长度,存储时会在末尾补足空格,适合固定长度的数据。
  • Varchar 是可变长度的字符串类型,定义时需要指定最大长度,实际存储根据实际长度占用相应的存储空间,适合存储长度可变的数据。

6 int(1) 和 int(10) 有什么不同

区别在于显示宽度,不改变存储方式。

7 Text 数据类型的大小

  • text 64kb
  • mediumtext 16Mb
  • longtext 4Gb 都是约等于

8 外键约束

外键约束的作用是维护表与表之间的关系,常用与 1 对多的表关系中,可以确保数据的完整性和一致性。 例子:文章分类表和文章表

9 in 和 exists 有什么区别

  1. in 用于检查左边表达式是否存在于右边列表中,适合外表大,内表小的情况,直接匹配值。
  2. exist 用于判断子查询是否至少能返回一行数据,适合外表小,内表大的情况,强调是否存在满足条件的记录。

10 MySQL 的基本函数有哪些

  1. 字符串函数
    • concat:连接多个字符串,返回合并后的字符串
    • length:返回字符串长度
    • substring:截取指定长度字符串
    • replace:将字符串中某个部分替换成另一个。
  2. 数值函数
    • abs:返回数字绝对值
    • power:返回指定数字的指定幂次方
  3. 日期和时间函数
    • now:返回当前日期和时间
    • curdate:返回当前日期
  4. 聚合函数有
    • count:计算指定列中非 NULL 个数
    • sum:计算指定列的总和
    • avg:计算指定列的平均值
    • max:返回指定列的最大值
    • min:返回指定列的最小值

11 SQL 查询语句的执行顺序是怎样的

text
(9) SELECT (10) DISTINCT <column>, (6) AGG_FUNC <column> or <expression>, ... (1) FROM <left_table> (3) <join_type>JOIN<right_table> (2) ON<join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (7) WITH {CUBE|ROLLUP} (8) HAVING <having_condtion> (11) ORDER BY <order_by_list> (12) LIMIT <limit_number>;

12 索引是什么?有什么好处?

索引是数据库中一种加快数据查找速度的数据结构,就像书的目录。它通过建立列值到行位置的映射,避免全表扫描,显著提升查询效率

13 执行一条 SQL 请求的过程

  1. 建立连接:通过连接器验证用户身份和权限,建立会话连接。
  2. 查询缓存(MySQL 8.0 前):系统先检查是否已有该查询的结果缓存,命中则直接返回结果,否则继续执行。
  3. SQL 解析:由解析器进行词法和语法分析,生成语法树,确保 SQL 语句合法。
  4. 执行阶段
    • 预处理:校验表、字段是否存在,解析 SELECT * 等。
    • 优化:优化器选择成本最低的执行计划(比如索引选择、连接顺序)。
    • 执行:调用存储引擎接口,读取或写入数据,最终将结果返回给客户端。

14 讲讲 MySQL 的引擎

  1. InnoDB:这是 MySQL 的默认引擎,支持事务(ACID)、行级锁和外键约束,适合高并发、读写混合的场景,能保证数据的一致性和完整性。
  2. MyISAM:查询性能较高,占用资源少,但只支持表级锁,不支持事务和外键。适合以读为主的场景,比如日志分析,但现在用得比较少了。
  3. Memory:数据存在内存中,读写非常快,但重启后数据会丢失。适合做临时缓存或临时表,不支持事务(ACID)、行级锁和外键约束。

15 为什么 InnoDB 是 MySQL 默认引擎

主要是因为它在数据安全、并发性能和可靠性方面表现更优,具体体现在三点:

  1. 支持事务:InnoDB 完全支持 ACID 事务,能保证数据的原子性、一致性、隔离性和持久性。
  2. 高并发能力:它支持行级锁,而不是表级锁,大大减少了锁冲突,提升了并发读写性能。
  3. 崩溃恢复能力强:InnoDB 通过 redo log 等机制,能在数据库异常宕机后自动恢复数据,保障数据不丢失。

16 MySQL InnoDB 和 MyISAM 的区别

InnoDB 和 MyISAM 的主要区别体现在四个方面:

  1. 事务支持:InnoDB 支持事务和 ACID 特性;MyISAM 不支持事务,无法回滚。
  2. 索引结构:InnoDB 使用聚簇索引,数据存储在主键索引的叶子节点上;MyISAM 是非聚簇索引,索引和数据文件是分离的。
  3. 锁机制:InnoDB 支持行级锁;MyISAM 只支持表级锁
  4. Count 性能:MyISAM 会缓存表的总行数,所以 COUNT(*) 非常快;而 InnoDB 需要实时扫描,COUNT(*) 相对较慢。

17 数据管理里,数据文件大体分成哪几种数据文件

  1. .opt 文件:每个数据库目录下都有,记录该数据库的默认字符集和校对规则
  2. .frm 文件:每个表都会有一个,用来存储表的结构定义,比如字段、类型、索引等元数据信息。
  3. .ibd 文件:这是 InnoDB 引擎的表空间文件,存放表的实际数据和索引。在独立表空间模式下,每个表对应一个 .ibd 文件。

18 索引是什么?有什么好处?

索引是数据库中一种加快数据查找速度的数据结构,就像书的目录。它通过建立列值到行位置的映射,避免全表扫描,以此提升查询效率

19 说一下索引分类

  1. 数据结构:B+tree索引、Hash索引、Full-text索引。
  2. 物理存储:聚簇索引(主键索引)、二级索引(辅助索引)。
  3. 字段特性:主键索引、唯一索引、普通索引、前缀索引。
  4. 字段个数:单列索引、联合索引。

20 聚簇索引和非聚簇索引的区别

  1. 数据存储方式
    聚簇索引的叶子节点直接存储完整的数据行,也就是说,索引和数据是绑定在一起的。
    而非聚簇索引的叶子节点只存主键值或行指针,不包含完整数据。
  2. 查询方式
    通过聚簇索引查询,可以直接拿到数据,一次查找完成。
    通过非聚簇索引查询,则需要先查到主键,再回到聚簇索引中查找数据。
  3. 数量
    一个表只能有一个聚簇索引,因为数据物理上只能按一种顺序组织(通常是主键)。
    但可以有多个非聚簇索引,比如在姓名、状态等字段上建索引。
  4. 效率
    聚簇索引对范围查询、排序特别高效,因为数据本身就是有序存储的。
    非聚簇索引因为需要进行回表操作,效率相对比较低。

21 如果聚簇索引的数据更新,它的存储要不要变化

聚簇索引的数据更新的话,存储结构是要变化的,因为要维护 b+ 树的有序性

22 MySQL 的主键是聚簇索引吗

在 InnoDB 存储引擎中,主键就是以聚簇索引的形式存储的。

23 什么字段适合当做主键值

  1. 基本要求:主键必须非空且唯一,能唯一标识每一行数据。
  2. 推荐使用递增字段:比如自增整数(AUTO_INCREMENT)。因为它是有序插入,能避免 InnoDB 中的页分裂,写入性能更好。

24 为什么性别字段不建议加索引

不建议给性别字段加索引,主要原因有两个:

  1. 区分度太低:性别通常只有“男”“女”两个值,假设表中有100万条数据,男女各占50万。那么查询 sex = '男' 会命中50%的数据,这种情况下,索引的筛选能力非常弱,选择性(Cardinality)接近于0
  2. 回表成本高:即使走索引,非聚簇索引的叶子节点只存主键,查到主键后还得回到聚簇索引进行回表操作。如果要查50万行,就意味着50万次回表,随机IO开销非常大。相比之下,全表扫描反而是更高效的执行方式。

25 为什么选用自增 ID 做主键而不是 UUID

如果是 UUID,其相对自增 ID 而言毫无规律,InnoDB 无法总是将新行插入到索引的最后,可能会进行频繁的页分裂操作来为新行分配新空间。所以使用 InnoDB引擎尽量可能按照主键的自增顺序操作,也就是最好使用自增ID。

26 为什么自增 ID 做主键比 UUID 快

  1. 插入性能更好
    自增 ID 是递增的,新行总是插入到索引的末尾,InnoDB 可以顺序写入,几乎不会引起页分裂,页的填充率也更高,减少了碎片。 而 UUID 是无序的,插入时可能落在 B+ 树的中间位置,频繁导致页分裂随机 IO,大大降低写入性能。
  2. 存储更节省
    自增 ID 通常用 INTBIGINT,占 4~8 字节;
    UUID 一般是字符串,占 36 字符(或转为二进制 16 字节),占用空间更大,导致单页存储的索引项更少
  3. 查询效率更高
    索引页能存的键值越少,B+ 树就越高,查询时需要的磁盘 IO 次数就越多
    同时,UUID 字符串比较也比整数比较更耗时。

27 Mysql中的索引是怎么实现的 ?

MySQL 的 InnoDB 引擎使用 B+ 树 作为索引的数据结构,B+ 树有几个关键特点:

  1. 多叉树结构,层级少:即使存储千万级数据,树的高度通常只有 3~4 层,意味着查询一次数据只需 3~4 次磁盘 I/O,效率非常高。
  2. 非叶子节点只存索引:不存储数据,只放主键或索引键值,这样每个节点能存更多索引项,进一步减少树高。
  3. 数据集中在叶子节点:所有数据都存储在叶子节点,并且按主键有序排列。叶子节点之间通过双向链表连接,支持高效的范围查询和顺序扫描。
总结

MySQL 的 InnoDB 引擎使用 B+树 作为索引的数据结构,即使存储千万级数据,树的高度也只有3~4层,也就是说查询一次数据只需要 3~4 次磁盘 I/O,效率很高; 此外,树的非叶子节点只存储索引,而叶子节点只存储数据集,这样可以大大减少树高,除此之外,叶子节点通过双向链表连接,查询效率很高。

28 B+ 树的特性是什么

  1. 所有叶子节点都在同一层。
  2. 非叶子节点存储键值。
  3. 叶子节点存储数据记录。
  4. 自平衡。

29 说说B+树和 B 树的区别

  1. 在B+树中,数据都存储在叶子节点上,而非叶子节点只存储索引信息;而B树的非叶子节点既存储索引信息也存储部分数据。
  2. B+树的叶子节点使用链表相连,便于范围查询和顺序访问;B树的叶子节点没有链表连接。
  3. B+树的查找性能更稳定,每次查找都需要查找到叶子节点;而B树的查找可能会在非叶子节点找到数据,性能相对不稳定。

30 B+ 树的好处是什么

  1. 数据都存储在叶子节点上,而非叶子节点只存储索引信息,树的高度不会很高,相应的磁盘 I/O 操作更少。
  2. 树的非叶子节点都是冗余节点,在插入和删除的时候不会出现复杂的树变化。
  3. 叶子节点用双向链表连接,有利于范围查询。‘

31 B+树叶子节点的链表是单向还是双向

双向的,为了更好的实现倒序或者排序。

32 联合索引的实现原理

联合索引在底层的使用多个字段的值作为 B+树非叶子节点的 key,并且使用最左匹配原则进行索引的匹配。

33 有哪些操作会导致索引失效

  1. 使用左或者左右模糊匹配,like %xxlike %xx%
  2. 查询条件中对索引列使用函数。
  3. 查询条件中对索引列进行表达式计算。
  4. 遇到字符串和数字比较的时候,如果字符串是索引列,类型转换使用的是 Cast 函数,等同于使用了函数,索引失效。
  5. 联合索引查询不遵循最左匹配原则。
  6. Where 子句中,如果在 or 前的条件列是索引列,而 or 后的条件列不是索引列,索引会失效。

34 什么情况下会回表查询

如果在二级索引的 B+树里找不到数据,就会进行回表查询,先检索二级索引,找到叶子节点,读取主键值,再检索主键索引查询查询数据。

35 什么是覆盖索引?

覆盖索引是指一个索引包含了查询所需的所有列,因此不需要访问表中的数据行就能完成查询。

36 如果一个列即使单列索引,又是联合索引,单独查它的话先走哪个?

mysql 优化器会分析每个索引的查询成本,然后选择成本最低的方案来执行 sql。

37 索引已经建好了,那我再插入一条数据,索引会有哪些变化?

插入新数据会导致 B+ 树结构调整和索引信息更新,以保证 B+ 树的正确性和平衡。

38 索引字段是不是建的越多越好?

不是,建的的越多会占用越多的空间,而且在写入频繁的场景下,对于B+树的维护所付出的性能消耗也会越大。

39 如果有一个字段是status值为0或者1,适合建索引吗。

不适合,区分度低的字段不适合建立索引。

40 索引的优缺点?

优点是可以提高查询速度。 缺点:

  1. 数据量越大,占用的存储空间也就越大。
  2. 会降低表的增删改效率,因为 B+ 树需要维护树的平衡性和准确性。

41 怎么决定建立哪些索引?

  1. 字段有唯一性限制。
  2. 经常用于 Where 查询条件的字段。
  3. 经常用于 Group ByOrder By 的字段,因为建立索引后的 B+树是排序好的。

42 索引优化详细讲讲

  1. 使用前缀索引优化,减少索引字段大小。
  2. 使用覆盖索引优化,减少回表次数。
  3. 防止索引失效。减少使用 like 左或者左右模糊查询,避免对索引列使用 函数,联合索引使用遵循最左匹配等。

43 了解过前缀索引吗

前缀索引是指对字符串字段的前几个字符建立索引,而不是对整个字段建的索引。使用前缀索引是为了减小索引字段大小,增加一个索引页中存储的索引值,有效提高索引的查询速度。

44 事务的特性是什么?

  1. 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
  2. 一致性:是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
  3. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

45 MySQL InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?

  • 持久性是通过 redo log (重做日志)来保证的;
  • 原子性是通过 undo log(回滚日志) 来保证的;
  • 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
  • 一致性则是通过持久性+原子性+隔离性来保证;

46 mysql可能出现什么和并发相关问题?

  1. 脏读。
  2. 不可重复读。
  3. 幻读。(指在一个事务中,相同的查询条件在不同时间执行,返回的结果集行数不同)

48 mysql的是怎么解决并发问题的?

  1. 锁机制:MySQL 提供了行级锁、表级锁、页级锁等锁机制,保证只有同一个操作能够访问和修改数据。
  2. 事务隔离级别:MySQL 提供了读未提交、读已提交、可重复读和串行化的事务隔离级别,可以控制多个事务之间的隔离程度,避免不一致。
  3. MVCC:MySQL 使用 MVCC 管理并发访问,在读取数据时,会根据事务隔离级别选择合适的数据版本,保证数据一致性。

49 事务的隔离级别有哪些

  1. 读未提交:指一个事务还没提交时,它做的变更就能被其他事务看到
  2. 读已提交:指一个事务提交之后,它做的变更才能被其他事务看到
  3. 可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的。
  4. 串行化:对记录加上读写锁,如果多个事务对这个数据进行读写,并且发生了读写冲突,后访问的事务必须等前一个事务执行完成,才能继续操作。

50 mysql默认级别是什么?

可重复读隔离级别

51 一条update是不是原子性的?为什么?

是原子性的,主要通过锁+ undo log 实现。

  • 执行 update 的时候,会加行级锁,保证一个事务更新一条记录的时候,不会被其他事务干扰。
  • 事务执行的过程中,会生成 undo log,如果事务执行失败,就可以通过 undo log 日志进行回滚。

52 滥用事务,或者一个事务里有特别多sql的弊端?

  1. 会造成锁定的数据太多,导致大量死锁和锁超时。
  2. 会记录大量回滚操作,占用大量存储空间。

53 MySQL 有哪些锁

  1. 全局锁
  2. 表级锁
    • 表锁
    • 元数据锁
    • 意向锁
  3. 行级锁
    • 记录锁(Record Lock)
    • 间隙锁(Gap Lock)
    • 临键锁(Next-Key Lock)

54 数据库的表锁和行锁有什么作用?

表锁:用于控制整个表的并发访问,适合需要大批量操作表中数据的场景。 行锁:用于精确控制对表中某行数据的访问,减少了锁竞争,适合需要频繁对表中单独行进行操作的场景。

55 MySQL两个线程的 update 语句同时处理一条数据,会不会有阻塞?

会,因为 InnoDB 实现了行级锁。

56 两条 update 语句处理一张表的不同的主键范围的记录, 一个<10,一个>15 会不会遇到阻塞?什底层是为么的?

不会,锁住的范围不同。

57 如果 2 个范围不是主键或索引?还会阻塞吗?

会阻塞,因为查询字段没有索引,就会触发全表扫描,会对全部记录了加锁。

58 日志文件是分成了哪几种?

  1. redo log 重做日志
  2. undo log 回滚日志
  3. bin log 二进制日志
  4. relay log 中继日志
  5. 慢查询日志

59 讲一下 binlog

Binlog(二进制日志)是 MySQL Server 层维护的一种日志,所有存储引擎都可以使用。它记录了数据库中所有的数据变更操作表结构变更,但不会记录查询类操作(如 SELECT)。它的主要用于主从复制和数据恢复。

Binlog 是追加写的方式,写满一个文件自动创建下一个,不会覆盖旧日志,它有三种格式:

  1. Statement:记录的是 SQL 语句本身。
  2. Row:记录每一行的数据修改前后变化。
  3. Mixed:混合模式,自动选择使用 Statement 还是 row。

60 UndoLog 日志的作用是什么?

Undo Log(回滚日志)主要用于保证事务的原子性,核心作用是:记录数据修改前的旧值,以便在事务回滚时能恢复到事务开始前的状态

具体来说:

  • 当插入一条记录时,记录这个主键值,回滚时就根据主键把这条记录删掉;
  • 当删除一条记录时,保存整行数据,回滚时再重新插入;
  • 当更新数据时,会保存被修改字段的旧值,回滚时再改回去。

61 有了 undolog 为啥还需要 redolog 呢?

redo log 是物理日志,记录了某个数据页做了什么修改,MySQL 重启后,可以根据 redo log 的内容,将所有数据恢复到最新的状态。

它们的区别在于:

  1. redo log 记录了此次事务完成后的状态,记录的是更新之后的值;
  2. undo log 记录了此次事务开始前的状态,记录的是更新之前的值;

62 redo log 怎么保证持久性的?

Redo log 通过 WAL(Write-Ahead Logging 先写日志) 机制来保证持久性。 它的核心流程是:所有对数据的修改都先写入 redo log,再更新内存中的数据页。只有当 redo log 持久化到磁盘后,事务才算提交成功。

MySQL 还引入了Checkpoint 机制
定期将内存中已脏的数据页刷回磁盘,并记录一个 日志序列号(LSN)。恢复时,只需要从最后一个 Checkpoint 开始重放日志,无需从头开始,大大加快恢复速度。**

63 能不能只用 binlog 不用 redo log?

不行,binlog是 server 层的日志,没办法记录哪些脏页还没有刷回磁盘,redolog 是存储引擎层的日志,可以记录哪些脏页还没有刷回磁盘,这样崩溃恢复的时候,就能恢复那些还没有被刷盘的脏页数据。

64 update 语句的具体执行过程是怎样的?

  1. 执行器调用引擎
    执行器通过主键索引(聚簇索引)找到目标行,调用 InnoDB 接口获取记录。

  2. 生成 Undo Log(回滚日志)
    在事务中,InnoDB 会先记录修改前的旧值到 undo log,用于事务回滚和 MVCC。

  3. 更新内存并写 Redo Log

    • 更新内存中的数据(标记为脏页);
    • 同时将修改操作写入 redo log(先写日志,WAL 机制);
    • 此时更新完成,但数据还在内存中,不立即刷盘
  4. 写入 Binlog(Server 层日志)
    更新操作完成后,MySQL Server 层会把该语句记录到 binlog cache 中,等待事务提交时才刷盘

  5. 两阶段提交(确保一致性)
    为了保证 redo log 和 binlog 的一致性,MySQL 采用两阶段提交:

    • Prepare 阶段:将 redo log 写入磁盘,并标记为 prepare 状态;
    • Commit 阶段:将 binlog 写入磁盘,再将 redo log 标记为 commit,事务正式提交。
  6. 后续刷脏
    后台线程会在合适时机将脏页刷新到磁盘,完成持久化。

总结

首先执行器通过主键索引找到目标行,调用 InnoDB 接口获取记录,然后记录修改前的旧值到 undo log 中;然后就是更新内存中的数据,标记为脏页,同时将修改操作写入 redo log,此时记录修改完成,MySQL Server 层会把该语句记录到 binlog 中;最后进行两阶段提交,第一阶段是将 redo log 写入磁盘,标记为 prepare 状态,然后将 binlog 写入磁盘,并将 redo log 中的记录修改了 commit,至此事务正确提交。此外,后台线程会在合适的时机将内存中的脏页刷新到磁盘,完成持久化

65 MySQL 是如何保障数据不丢失的?

主要是通过 redo log 来实现事务持久化的,在事务执行时, 会将修改操作记录到 redo log 中,在事务提交时,会先将 redo log 刷入磁盘,即使后续脏页没有刷盘成功,或者数据库宕机了,也能通过 redo log 恢复到数据页修改后的状态,保证数据不丢失。

66 RedoLog 是在内存里吗?

事务执行过程中是在内存中的,事务提交的时候,就会写入磁盘。

67 为什么要写 RedoLog,而不是直接写到 B+树 里面?

因为 redolog 写入磁盘是顺序写,而 b+树里数据页写入磁盘是随机写,顺序写的性能会比随机写好,这样可以提升事务提交的效率。

68 mysql 的 explain 有什么作用?

EXPLAIN 是 MySQL 中用于分析 SQL 执行计划的关键字。可以查看 MySQL 如何执行这条查询,比如是否使用了索引、访问了多少行、表的连接顺序等。它帮助我们发现性能瓶颈,进而优化 SQL 查询和索引设计。

69 给你张表,发现查询速度很慢,你有那些解决方案?

  1. 分析查询语句
  2. 创建或优化索引
  3. 避免索引失效
  4. 查询优化
  5. 分页优化
  6. 优化数据表
  7. 使用缓存技术

70 如果Explain用到的索引不正确的话,有什么办法干预吗?

可以使用 force index,强制走索引。


71 什么是聚簇索引?什么是非聚簇索引?

  • 聚簇索引是指索引的叶子节点直接包含完整的数据行
  • 非聚簇索引(或二级索引)的叶子节点不包含完整的数据行,而是存储主键值。

72 你所说的 B+ 树的页分裂是什么?

B+树的页分裂是指当一个数据页(Page)已满,无法再插入新记录时,为了维持 B+ 树的结构和有序性,将该页分裂成两个页的过程。

来源 MySQL面试题 | 小林coding | Java面试学习

作者: Xigrut发布时间: 2025-09-23 20:19:27上次编辑时间: 2026-06-18 19:26:11 许可协议: CC BY-NC-SA 4.0
留言区