常用索引有哪些?联合索引使用时要注意什么?什么是最左匹配原则?联合索引(a, b, c),使用(b, c) 可以命中索引吗?(a, c) 呢?


1. 常用索引有哪些?

回答:

常用的索引主要包括以下几种:

  • 主键索引(Primary Key Index):唯一且非空的索引,通常用于标识表中的每一行数据。
  • 唯一索引(Unique Index):保证索引列的值唯一,但允许为空。
  • 普通索引(Normal Index):最基本的索引类型,用于加速查询,无唯一性约束。
  • 联合索引(Composite Index):由多个列组合而成,用于优化多条件查询。
  • 全文索引(Full-Text Index):用于文本搜索,常见于需要模糊匹配的场景(如 MySQL 的 InnoDB 或 MyISAM)。
  • 覆盖索引(Covering Index):一种特殊情况,指查询的所有字段都包含在索引中,无需回表。

复盘:

这个回答基本覆盖了常见的索引类型。如果面试官期待更深入的内容,可以补充一些数据库引擎特定的索引(如 B+ 树索引、哈希索引)或场景化的例子(如空间索引用于地理数据)。


2. 联合索引使用时要注意什么?

回答:

使用联合索引时需要注意以下几点:

  • 字段顺序:联合索引的字段顺序会影响其使用效率,查询条件应尽量遵循最左匹配原则。
  • 选择性:优先将区分度高的字段放在前面(如性别字段区分度低,不适合放首位)。
  • 查询条件:WHERE、JOIN、ORDER BY 等语句中涉及的字段应尽量与联合索引匹配,否则可能无法命中。
  • 覆盖索引:如果查询的字段都在索引中,可以避免回表,提升性能。
  • 冗余索引:避免创建重复或冗余的联合索引,增加维护成本。

复盘:

回答中提到了一些关键点,但可以更具体。例如,可以补充"索引维护会增加写操作的开销"或"避免在频繁更新的表上滥用联合索引"。如果面试官关注细节,可以举例说明选择性对性能的影响。


3. 什么是最左匹配原则?

回答:

最左匹配原则是指在使用联合索引时,查询条件必须从索引的最左边字段开始匹配,且不能跳过中间的字段。

例如,对于联合索引 (a, b, c)

  • 查询条件 WHERE a = 1WHERE a = 1 AND b = 2 可以命中索引。
  • WHERE b = 2WHERE c = 3 无法命中,因为没有从最左字段 a 开始。
    这是因为数据库底层(如 B+ 树)按索引字段顺序组织数据,跳过左侧字段会导致无法定位索引。

复盘:

这个回答解释了最左匹配的核心逻辑,并给出了例子。如果面试官追问,可以补充"最左匹配是基于索引的物理结构决定的",或者提到"范围查询(如 a > 1)可能会影响后续字段的匹配"。


4. 联合索引 (a, b, c),使用 (b, c) 可以命中索引吗?(a, c) 呢?

回答:

  • 使用 (b, c) :无法命中索引。因为根据最左匹配原则,联合索引 (a, b, c) 要求查询从 a 开始,而 (b, c) 跳过了 a,所以不会使用该索引。
  • 使用 (a, c) :可以部分命中索引。查询会利用 a 字段的索引,但 c 无法直接命中,因为中间的 b 被跳过了。数据库可能会用 a 定位后再回表或扫描剩余条件。

复盘:

回答准确地应用了最左匹配原则。如果面试官进一步提问,可以补充"具体命中情况还需看执行计划(EXPLAIN)"或"如果查询字段都在索引中,(a, c) 可能通过覆盖索引优化"。还可以提到优化建议,如调整索引为 (a, c, b) 以适配特定查询。

相关推荐
冰暮流星1 分钟前
flask之定义URL
后端·python·flask
程序员爱钓鱼1 小时前
为什么学习 Rust?Rust 能做什么?
后端·rust
掘金者阿豪2 小时前
Docker命令太多记不住?用Portainer把容器管理变成可视化操作
后端
用户69371750013842 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
Rain的Java大神之路2 小时前
高并发下的抢优惠券如何设计
后端
钟智强2 小时前
AWS CloudGoat 实战:一个 SSRF 如何撬动整个云账户
后端
Ai拆代码的曹操2 小时前
@Transactional 写在 private 方法上,事务根本没生效
后端
云技纵横2 小时前
@Async 默认执行器又炸了:SimpleAsyncTaskExecutor 为什么不是线程池?
后端·面试
程序员Agions2 小时前
Fypro 新手快速上手与实战指南
后端
舒心的云朵3 小时前
用三张图片详解Asp.Net 全生命周期
后端·asp.net