关系型数据库通过查询计划、索引策略和执行技术相结合来优化查询。当提交查询时,数据库的查询分析器会生成多个潜在的执行计划,评估它们的成本(基于磁盘 I/O、CPU 使用率和内存等因素),并选择最有效的选项。此过程平衡了对快速结果的需求与资源约束,通常利用诸如表统计信息和索引详细信息之类的元数据来进行明智的决策。
一种关键的优化方法是使用索引来减少数据扫描。例如,B 树索引允许数据库快速定位与 WHERE 子句匹配的行,而无需扫描整个表。如果查询按具有索引的列进行筛选,则优化器可能会选择索引扫描而不是全表扫描。数据库还考虑复合索引(多个列上的索引),用于具有多个过滤器或排序要求的查询。此外,覆盖索引(包含查询所需的所有列的索引)消除了完全访问底层表的需求。对于连接,优化器会评估连接顺序和算法(例如,用于大型数据集的哈希连接,用于小型数据集的嵌套循环)以最小化中间结果的大小。关于表行数和数据分布的统计信息指导这些选择,这就是为什么过时的统计信息会导致次优计划的原因。
执行阶段的优化进一步提高了性能。例如,查询缓存存储频繁查询的结果,以避免重复计算。数据库也可以在内部重写查询,例如将筛选条件推送到更靠近数据源的位置,以减少管道早期处理的数据量。物化视图预先计算并存储复杂的查询结果,以便更快地访问。将大型表基于日期范围等标准分成较小的块,使数据库能够在扫描期间跳过不相关的分区。开发人员可以通过构造与这些机制对齐的查询来影响优化 - 例如,避免不必要的 SELECT * 或使用 EXPLAIN 计划来识别瓶颈。这些优化协同工作以确保查询高效执行,即使数据扩展也是如此。