Skip to content

面试速答(先看这里)

**一句话结论:**对于频繁查询的列,可以创建索引来加速查询,但对于不经常查询或者数据量较少的列,可以不创建索引。

60秒标准回答:

考虑查询的频率和效率 :在决定创建索引之前,需要分析查询频率和效率

对于频繁查询的列,可以创建索引来加速查询,但对于不经常查询或者数据量较少的列,可以不创建索引

选择适合的索引类型 :MySQL提供了多种索引类型,如B+Tree索引、哈希索引和全文索引等

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

**记忆锚点:**避免创建过多的索引 → 考虑联合索引 → 际情况选择适合的索引 → 度不高的字段作为索引 → 组合在一起创建的索引 → 放在一起创建联合索引

关键取舍:

  • 不同类型的索引适用于不同的查询操作,需要根据实际情况选择适合的索引类型。
  • 避免创建过多的索引 :创建过多的索引会占用大量的磁盘空间,影响写入性能。

易错提醒:

  • 考虑区分度: 尽量不要选择区分度不高的字段作为索引,比如性别。
  • 考虑索引覆盖: 联合索引可以通过索引覆盖而避免回表查询,可以大大提升效率,对于频繁的查询,可以考虑将select后面的字段和where后面的条件放在一起创建联合索引。

加分表达:

  • 但是也并不绝对,对于一些数据倾斜比较严重的字段,虽然区分度不高,但是如果有索引,查询占比少的数据时效率也会提升。
  • 合适的索引长度 :虽然索引不建议太长,但是也要合理设置,如果设置的太短,比如身份证号,但是只把前面6位作为索引,那么可能会导致大量锁冲突。

追问准备:

  • 围绕「避免创建过多的索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「考虑联合索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「际情况选择适合的索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

  1. 考虑查询的频率和效率:在决定创建索引之前,需要分析查询频率和效率。对于频繁查询的列,可以创建索引来加速查询,但对于不经常查询或者数据量较少的列,可以不创建索引。

  2. 选择适合的索引类型:MySQL提供了多种索引类型,如B+Tree索引、哈希索引和全文索引等。不同类型的索引适用于不同的查询操作,需要根据实际情况选择适合的索引类型。

  3. **考虑区分度:**尽量不要选择区分度不高的字段作为索引,比如性别。但是也并不绝对,对于一些数据倾斜比较严重的字段,虽然区分度不高,但是如果有索引,查询占比少的数据时效率也会提升。

📄 ✅区分度不高的字段建索引一定没用吗?

打开文档:✅区分度不高的字段建索引一定没用吗?

  1. 考虑联合索引:联合索引是将多个列组合在一起创建的索引。当多个列一起被频繁查询时,可以考虑创建联合索引。

  2. **考虑索引覆盖:**联合索引可以通过索引覆盖而避免回表查询,可以大大提升效率,对于频繁的查询,可以考虑将select后面的字段和where后面的条件放在一起创建联合索引。

📄 ✅什么是回表,怎么减少回表的次数?

打开文档:✅什么是回表,怎么减少回表的次数?

  1. 避免创建过多的索引:创建过多的索引会占用大量的磁盘空间,影响写入性能。并且在数据新增和删除时也需要对索引进行维护。所以在创建索引时,需要仔细考虑需要索引的列,避免创建过多的索引。

📄 ✅联合索引是越多越好吗?

打开文档:✅联合索引是越多越好吗?

  1. 避免使用过长的索引:索引列的长度越长,索引效率越低。在创建索引时,需要选择长度合适的列作为索引列。对于文本列,可以使用前缀索引来减少索引大小。

  2. 合适的索引长度:虽然索引不建议太长,但是也要合理设置,如果设置的太短,比如身份证号,但是只把前面6位作为索引,那么可能会导致大量锁冲突。

  3. 执行计划分析:多用执行计划分析,因为随着数据库的数据量变化、索引数量变化,最终使用的索引可能也不太一样,所以需要经常查看索引是否有使用对。

📄 ✅为什么MySQL会选错索引,如何解决?

打开文档:✅为什么MySQL会选错索引,如何解决?