面试题答案
一键面试SELECT
product_id,
ROUND(SUM(quantity * price), 2) AS total_sales
FROM
sales
GROUP BY
product_id
ORDER BY
total_sales DESC;
优化思路
- 索引优化:
- 在
product_id
字段上创建索引,如果product_id
是表的主键,那么数据库一般会自动创建索引。如果不是,可以使用CREATE INDEX idx_product_id ON sales(product_id);
语句创建索引。这样在进行GROUP BY
操作时,可以快速定位到不同的product_id
分组,提高查询性能。
- 在
- 避免函数计算:
- 在查询中,尽量避免在
WHERE
子句中对字段进行函数计算。这里计算总销售额在SELECT
子句中进行,不影响性能。如果在WHERE
子句中对quantity
或price
字段进行函数计算,数据库可能无法使用索引,导致全表扫描,性能下降。
- 在查询中,尽量避免在
- 适当使用覆盖索引:
- 如果查询涉及的字段(如
product_id
和total_sales
计算所需的quantity
和price
)都包含在索引中,数据库可以直接从索引中获取数据,而不需要回表操作,从而提高查询性能。例如,可以创建一个复合索引CREATE INDEX idx_product_quantity_price ON sales(product_id, quantity, price);
,但要注意索引的维护成本,避免过多的复合索引。
- 如果查询涉及的字段(如