数据库索引面试题是经常考察的内容,下面给大家总结了一份非常全面数据库索引面试题及答案@mikechen
1.什么是数据库索引?
数据库索引是一种数据结构,用于加快数据库查询操作的速度。
它类似于书籍的目录,提供了一个快速查找数据的方法,从而减少全表扫描的需求。
2.什么是主键索引(Primary Key Index)?
主键索引用于标识表中的每一行数据,确保每个主键值都是唯一的。
主键索引的设计主要目的是为了提高查询性能和确保数据的完整性。
在SQL中,创建主键索引通常使用PRIMARY KEY
约束,如下所示:
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100) );
3.什么是唯一索引(Unique Index)?
唯一索引确保索引列中的值是唯一的,但可以包含多个NULL值。
在SQL中,可以使用UNIQUE
约束来创建唯一索引,如下所示:
CREATE TABLE emails ( id INT PRIMARY KEY, email VARCHAR(100) UNIQUE, user_id INT );
4.主键索引和唯一索引有什么区别?
需要解释主键索引用于标识表中的每一行,而唯一索引确保列中的值是唯一的,但可以有多个NULL值。
5.什么是聚集索引(Clustered Index)?
聚集索引决定了数据表中数据的物理排序顺序,一个数据表只能有一个聚集索引,通常与主键相关联。
在聚集索引中,叶结点也即数据结点,所有数据行的存储顺序与索引的存储顺序一致。

6.什么是非聚集索引(Non-Clustered Index)?
非聚集索引是独立于数据存储的索引,它包含索引列的值和对应的行指针,一张表可以有多个非聚集索引。
非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表记录的指针。
7.什么是复合索引(Composite Index):?
复合索引基于多个列的组合而创建,用于优化涉及多个列的查询,复合索引可减少查询中的列数,但选择正确的列顺序很重要。
8.什么是全文索引(Full-Text Index)?
全文索引用于对文本字段进行全文搜索,可以识别单词和短语,支持模糊查询和关键词搜索。
9.什么情况下应该创建索引?
应该在以下情况下考虑创建索引:
- 经常用于查询条件的列。
- 用于连接(JOIN)操作的外键列。
- 用于排序和分组的列。
- 经常被用于搜索的列。
10.如何优化索引的性能?
使用explain查看执行计划,从而知道mysql是如何处理sql语句,分析查询语句或者表结构的性能瓶颈。
除此之外,还可以通过以下方式来优化索引的性能:
- 使用合适的索引类型。
- 避免创建过多的索引。
- 定期维护和重新组织索引。
- 使用合适的数据类型和长度以减小索引大小。
- 使用合理的查询和连接方式,以充分利用索引。
- 考虑分库分表、缓存等技术来优化性能。
11.哪些情况索引会失效?
以下是一些常见情况下索引可能失效的情况:
- 使用函数或表达式: 如果在查询中使用了函数、表达式或运算符对索引列进行操作,索引可能会失效。
- 使用通配符在开始位置: 当在查询中使用通配符(如
%
)在索引列的开始位置进行模糊匹配时,索引可能会失效,例如,WHERE name LIKE '%John'
。 - 列类型不匹配: 如果查询中使用的列类型与索引列的类型不匹配,索引可能会失效,例如,将数字列与字符索引进行比较。
- OR操作符: 当使用多个
OR
操作符连接不同条件时,如果这些条件没有使用索引,整个查询可能无法充分利用索引。 - 数据量过小: 对于非常小的数据表,使用索引可能不会带来显著的性能提升,因为数据库可能更倾向于执行全表扫描。
- 连接操作和排序: 在连接大型表或对大数据集进行排序时,数据库可能会选择执行全表扫描而不是使用索引。
- 统计信息不准确: 数据库使用统计信息来决定如何优化查询计划。如果统计信息过期或不准确,数据库可能无法正确估计索引的选择性。
- 强制使用索引: 在某些情况下,通过强制查询使用索引的方式,可能导致数据库选择了不适当的查询计划,从而降低性能。
12.建立索引的原则有哪些?
建立索引是数据库性能优化的关键策略之一,以下是建立索引时应遵循的一些原则:
- 选择合适的列: 选择那些在查询中频繁用于条件过滤、连接、排序或分组的列作为索引列。
- 避免过多索引:避免在不需要的列上创建索引,以减少索引维护开销。
- 优先考虑主键和唯一约束: 主键和唯一约束自动创建唯一索引,因此优先考虑使用它们作为索引。
- 选择复合索引: 对于涉及多个列的查询,选择创建复合索引。
- 定期维护索引: 定期重新组织或重新生成索引,以减少碎片化,优化查询性能,特别是在数据量增长后。
- 避免频繁更新的列: 对于频繁更新的列,索引可能会导致性能下降。
- 评估查询计划: 使用数据库提供的查询计划工具来评估查询的执行计划,确保查询能够充分利用已创建的索引。
- 避免索引失效: 注意那些可能导致索引失效的情况,如使用函数、通配符在开始位置、数据类型不匹配等。
- 监控性能: 使用数据库监控工具来跟踪索引的性能和查询的执行情况,如果发现性能下降,可能需要重新评估索引策略。
- 分区和分表: 对于大型数据表,可以考虑使用分区或分表技术来优化性能,减少索引的大小。
- 平衡读写操作: 创建索引会影响写操作的性能,因此需要权衡读写操作的比例和索引的数量。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获知最新一线技术干货!
