MST

星途 面试题库

面试题:MySQL中检索列数据与复杂数据处理及性能优化

假设有一张订单表orders,包含列order_id、customer_id、order_date、total_amount。现在要检索出每个客户最近一次订单的order_id、order_date和total_amount,同时要求查询语句在大数据量下有较好的性能表现,你将如何设计SQL查询以及可能涉及到的优化策略?
21.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. SQL查询
    • MySQL 8.0及以上版本
WITH RankedOrders AS (
    SELECT
        order_id,
        customer_id,
        order_date,
        total_amount,
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
    FROM orders
)
SELECT
    order_id,
    customer_id,
    order_date,
    total_amount
FROM RankedOrders
WHERE rn = 1;
  • Oracle
SELECT
    order_id,
    customer_id,
    order_date,
    total_amount
FROM (
    SELECT
        order_id,
        customer_id,
        order_date,
        total_amount,
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
    FROM orders
) RankedOrders
WHERE rn = 1;
  • SQL Server
WITH RankedOrders AS (
    SELECT
        order_id,
        customer_id,
        order_date,
        total_amount,
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
    FROM orders
)
SELECT
    order_id,
    customer_id,
    order_date,
    total_amount
FROM RankedOrders
WHERE rn = 1;
  1. 优化策略
    • 索引优化
      • orders表的customer_idorder_date列上创建复合索引,例如在MySQL中:CREATE INDEX idx_customer_date ON orders (customer_id, order_date DESC); 这样可以加速PARTITION BYORDER BY操作。
    • 分区表
      • 如果数据量非常大,可以考虑对orders表按customer_idorder_date进行分区。例如按order_date进行范围分区,将不同时间段的数据分布在不同的分区中,查询时可以快速定位到相关分区,减少扫描的数据量。
    • 查询执行计划分析
      • 使用数据库自带的查询执行计划分析工具(如MySQL的EXPLAIN关键字),分析查询的执行计划,查看索引是否被正确使用,是否存在全表扫描等性能问题,根据分析结果进一步优化查询。