面试题答案
一键面试- 分析现有索引:
- 使用
EXPLAIN
命令分析查询计划,例如:EXPLAIN SELECT * FROM employees WHERE department = 'HR' AND salary > 50000;
。EXPLAIN
会展示PostgreSQL如何执行查询,包括是否使用了索引以及扫描的方式等。 - 查看是否有适合的索引被使用。对于
department
和salary
列,如果没有索引,可能会导致全表扫描,从而性能不佳。
- 使用
- 创建复合索引:
- 根据查询条件,可以考虑创建一个复合索引。语法如下:
CREATE INDEX idx_employees_department_salary ON employees (department, salary);
- 复合索引中列的顺序很重要。在这个例子中,将
department
放在前面,因为查询首先筛选出department = 'HR'
的记录,然后再筛选salary > 50000
的记录。如果查询条件顺序经常变化,可以考虑创建多个复合索引,但要注意过多索引会增加写入成本。
- 重新分析查询:
- 创建索引后,再次使用
EXPLAIN
命令分析查询计划:EXPLAIN SELECT * FROM employees WHERE department = 'HR' AND salary > 50000;
。 - 确认查询计划是否使用了新创建的索引,并且扫描方式是否从全表扫描变为索引扫描,若变为索引扫描,性能应该会有显著提升。
- 创建索引后,再次使用
- 索引维护:
- 随着数据的插入、更新和删除,索引可能会碎片化。定期使用
VACUUM
命令对表和索引进行维护,例如:VACUUM ANALYZE employees;
。VACUUM
可以回收空间并更新统计信息,有助于查询优化器生成更优的查询计划。
- 随着数据的插入、更新和删除,索引可能会碎片化。定期使用