面试题答案
一键面试查看执行计划的方法
不同的数据库系统查看执行计划的方式略有不同:
- MySQL:在
SELECT
语句前加上EXPLAIN
关键字,例如EXPLAIN SELECT column1, column2 FROM your_table WHERE condition;
。执行后,MySQL 会返回一个结果集,展示查询的执行计划信息。 - Oracle:同样使用
EXPLAIN PLAN FOR
语句,例如EXPLAIN PLAN FOR SELECT column1, column2 FROM your_table WHERE condition;
。然后通过SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
来查看执行计划。 - SQL Server:在查询分析器中,可使用
SET SHOWPLAN_ALL ON
,然后执行查询语句,结果会显示执行计划的详细信息。也可使用图形化界面(如 SQL Server Management Studio)中的“显示估计执行计划”按钮。
执行计划中常见关键指标含义
- Cost(成本):
- 它是数据库查询优化器评估执行一个查询所需资源(如 CPU、I/O 等)的一个量化指标。不同数据库计算成本的算法不同,但总体来说,成本越低,查询执行效率越高。例如在 PostgreSQL 中,Cost 综合考虑了磁盘 I/O 成本、CPU 成本等因素,优化器会选择成本最低的执行路径。
- Rows(行数):
- 表示查询优化器估计该操作符将返回的行数。这对于评估查询的规模和资源消耗很重要。例如,如果一个表扫描操作估计返回大量的行,可能意味着较高的 I/O 成本。准确估计行数有助于优化器选择更合适的索引和连接策略。
根据执行计划初步调整性能的方面
- 索引优化:
- 缺失索引:如果执行计划显示全表扫描(如 MySQL 中
type
为ALL
)且返回行数较多,可能缺少合适的索引。例如对于条件WHERE column1 = 'value'
,若没有在column1
上创建索引,数据库可能会进行全表扫描。此时可考虑在column1
上创建索引。 - 索引选择不当:有时虽然有索引,但优化器可能选择了不合适的索引。可以通过强制使用索引(如 MySQL 中使用
FORCE INDEX
语法)进行测试,看性能是否提升,从而确定是否需要调整索引结构或优化器的索引选择策略。
- 缺失索引:如果执行计划显示全表扫描(如 MySQL 中
- 表连接优化:
- 连接类型:查看执行计划中表连接的类型(如嵌套循环连接
Nested Loop
、哈希连接Hash Join
、排序合并连接Sort Merge Join
)。如果连接类型不合理,可能导致性能问题。例如,当一个大表和一个小表连接时,哈希连接可能比嵌套循环连接更高效。若执行计划中使用了效率较低的连接类型,可尝试调整查询结构或添加合适的索引来引导优化器选择更好的连接类型。 - 连接条件:确保连接条件正确且尽可能高效。例如,连接条件中使用了函数操作(如
WHERE UPPER(table1.column) = table2.column
)可能会阻止索引的使用,应尽量避免在连接条件中对列进行函数操作。
- 连接类型:查看执行计划中表连接的类型(如嵌套循环连接
- 查询结构优化:
- 子查询优化:如果执行计划中包含子查询,且子查询执行成本较高,可考虑将子查询改写为连接(如将
IN
子查询改写为JOIN
),有时这种改写能显著提升性能。 - 冗余字段和条件:检查查询中是否存在冗余的字段选择(
SELECT
中不必要的列)和条件(WHERE
中重复或无效的条件),去除这些冗余部分可以减少数据传输和处理量。
- 子查询优化:如果执行计划中包含子查询,且子查询执行成本较高,可考虑将子查询改写为连接(如将