面试题答案
一键面试SQL查询
SELECT o.order_id, c.customer_name, o.total_amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.region = 'Asia'
AND o.status = 'completed'
AND o.order_date >= CURRENT_DATE - INTERVAL '1 year';
条件过滤和索引相互作用机制
- 索引的使用:
- customers表的region索引:在
WHERE c.region = 'Asia'
条件中,PostgreSQL可以利用customers
表region
字段上的索引,快速定位到来自 'Asia' 地区的客户记录,减少需要扫描的行数。 - orders表的status索引:对于
WHERE o.status = 'completed'
条件,通过orders
表status
字段上的索引,能高效筛选出订单状态为 'completed' 的订单记录。 - orders表的order_date索引:
WHERE o.order_date >= CURRENT_DATE - INTERVAL '1 year'
条件使用orders
表order_date
字段上的索引,按日期范围快速过滤订单。
- customers表的region索引:在
- 条件过滤顺序:PostgreSQL优化器会基于统计信息和索引情况决定执行顺序。理想情况下,会先利用每个表上的索引分别过滤出满足条件的行,再通过
JOIN
操作将符合条件的订单和客户信息关联起来。这减少了参与JOIN
操作的数据量,进而提升查询效率。 - 索引选择性:索引的选择性越高(即索引列中不同值的比例越高),其过滤数据的效果越好,查询优化的效果也越显著。例如,如果
region
字段有很多不同的地区值,region
索引就能更有效地过滤出 'Asia' 地区的客户,加快查询速度。