面试题答案
一键面试1. 索引优化
- 分析:为了加速查询,我们可以在相关字段上创建索引。对于查询每个用户最近一个月内金额最高的订单信息,
用户ID
、订单时间
和订单金额
字段都很关键。 - 创建索引语句:
CREATE INDEX idx_user_order_date_amount ON 表名 (用户ID, 订单时间, 订单金额);
2. 查询语句优化
- 优化前查询语句:
SELECT *
FROM 表名 AS t1
WHERE 订单时间 >= DATE('now', '-1 month')
AND 订单ID = (
SELECT MAX(订单ID)
FROM 表名 AS t2
WHERE t2.用户ID = t1.用户ID
AND t2.订单时间 >= DATE('now', '-1 month')
);
-
性能分析:此查询子查询部分对于每个外层查询的行都会执行一次,性能较差,尤其是在数据量较大时。
-
优化后查询语句:
WITH filtered_orders AS (
SELECT *
FROM 表名
WHERE 订单时间 >= DATE('now', '-1 month')
)
SELECT 用户ID, MAX(订单金额) AS max_amount
FROM filtered_orders
GROUP BY 用户ID;
- 性能分析:使用CTE(公共表表达式)先过滤出最近一个月的订单,然后在这个较小的数据集上进行分组聚合,减少了子查询的重复执行,性能会有明显提升。
3. 性能对比
- 测试环境:假设在一个有100万条订单数据的表上进行测试。
- 优化前:执行时间较长,因为子查询重复执行次数多,随着数据量增加,性能下降明显。
- 优化后:执行时间显著缩短,通过先过滤数据和合理使用分组聚合,减少了查询的数据量和计算量。具体性能提升倍数会因实际数据量和硬件环境有所不同,但一般在数据量较大时优化效果会非常明显。