面试题答案
一键面试普通索引
- 扫描方式影响:普通索引允许在索引列中出现重复值。当使用普通索引进行查询时,数据库可能会利用索引快速定位到符合条件的索引项,但由于存在重复值,可能需要进一步回表操作来获取完整的行数据。如果查询条件涉及多个普通索引列,MySQL查询优化器会评估使用哪个索引或者是否使用索引合并策略。
- 举例:假设有一张
employees
表,包含id
、name
、age
等字段,在age
字段上创建了普通索引。执行查询SELECT * FROM employees WHERE age = 30;
,MySQL 首先通过age
索引找到所有age
为 30 的索引项,然后根据索引项中的指针回表获取每一行的完整数据。
唯一索引
- 扫描方式影响:唯一索引确保索引列中的值是唯一的(除了
NULL
值可以重复)。这使得查询时一旦通过唯一索引定位到符合条件的索引项,就可以确定对应的行数据,通常不需要像普通索引那样多次回表(前提是查询的字段都包含在索引中,即覆盖索引)。如果查询条件是唯一索引的完整值,查询速度会非常快,因为能直接定位到唯一的行。 - 举例:在
employees
表的email
字段上创建唯一索引。执行查询SELECT * FROM employees WHERE email = 'test@example.com';
,MySQL 利用email
唯一索引迅速定位到唯一的索引项,直接获取对应的完整行数据,无需额外回表操作(假设查询字段只有email
以及索引是覆盖索引的情况)。
主键索引
- 扫描方式影响:主键索引是一种特殊的唯一索引,它不仅要求值唯一,而且不能为空。主键索引决定了表中数据的物理存储顺序(聚簇索引),基于主键的查询性能非常高。当使用主键进行查询时,MySQL 可以直接通过主键索引定位到具体的行,不需要额外的回表操作,因为数据行本身就存储在主键索引的叶子节点中。
- 举例:假设
employees
表的主键是id
。执行查询SELECT * FROM employees WHERE id = 1001;
,MySQL 利用主键索引直接定位到id
为 1001 的行数据,由于数据和主键索引紧密关联存储,查询效率极高。