面试题答案
一键面试-
覆盖索引
- 适用场景:当查询只需要返回索引列中的数据,不需要额外的表数据时适用。例如,在统计查询中,只需要计算某几个索引列的总和、数量等,不需要获取整行记录的详细信息。
- 原理:创建包含查询所需所有列的索引。这样,查询时数据库引擎可以直接从索引中获取所需数据,而无需再回到表中查找,因为索引本身已经“覆盖”了查询所需的全部信息。例如,若查询
SELECT column1, column2 FROM table WHERE condition
,可创建索引CREATE INDEX idx_column1_column2 ON table (column1, column2);
。
-
索引合并
- 适用场景:当查询条件涉及多个独立的索引列,且每个索引都能筛选出一部分数据时适用。例如,查询
SELECT * FROM table WHERE column1 = value1 AND column2 = value2
,且column1
和column2
上分别有索引。 - 原理:PostgreSQL 可以使用多个索引分别进行扫描,然后将这些扫描结果合并起来。数据库引擎会分别从每个索引中获取满足各自条件的行的位置信息,然后通过某种方式(如交集操作)将这些结果合并,以确定最终符合条件的行,减少不必要的回表操作。
- 适用场景:当查询条件涉及多个独立的索引列,且每个索引都能筛选出一部分数据时适用。例如,查询
-
物化视图
- 适用场景:适用于复杂查询经常执行,且基础数据变化频率较低的场景。例如,用于生成报表的复杂查询,报表数据可能每天更新一次,而查询可能一天内多次执行。
- 原理:物化视图是将查询结果存储在数据库中的一种对象。当创建物化视图时,PostgreSQL 会执行指定的查询,并将结果存储起来。后续查询时,如果数据没有变化,可以直接从物化视图中获取数据,而不需要再次执行复杂的查询和回表操作。更新物化视图时,可以使用
REFRESH MATERIALIZED VIEW
语句,根据需要选择完全刷新或增量刷新。
-
索引结构优化
- 适用场景:原索引结构不合理,导致查询性能低下的场景。例如,复合索引的列顺序错误,导致部分索引无法有效利用。
- 原理:分析查询条件,确保索引结构与查询匹配。对于复合索引,列的顺序非常重要,应将选择性高(基数大)的列放在前面。例如,在查询
SELECT * FROM table WHERE column1 = value1 AND column2 = value2
中,如果column1
的选择性比column2
高,应创建索引CREATE INDEX idx_column1_column2 ON table (column1, column2);
,这样可以更有效地利用索引,减少回表。