MST

星途 面试题库

面试题:MySQL LIMIT分页查询优化之复杂场景

有一个复杂的电商业务场景,涉及到商品表`products`、订单表`orders`、用户表`users`三张表。`orders`表通过`product_id`关联`products`表,通过`user_id`关联`users`表。现在要实现按用户购买商品的总金额进行分页查询,每页15条数据,并且要实时计算总金额。请设计出高效的查询方案,包括SQL语句及相关优化策略,并解释为什么这种方案在性能上更优。
11.6万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

SQL语句

-- 使用WITH子句先计算每个用户的购买总金额
WITH UserTotalAmount AS (
    SELECT 
        u.user_id, 
        SUM(p.price * o.quantity) AS total_amount
    FROM 
        users u
    JOIN 
        orders o ON u.user_id = o.user_id
    JOIN 
        products p ON o.product_id = p.product_id
    GROUP BY 
        u.user_id
)
-- 进行分页查询
SELECT 
    user_id, 
    total_amount
FROM 
    UserTotalAmount
ORDER BY 
    total_amount DESC
LIMIT 15 OFFSET 0;

优化策略

  1. 索引优化
    • users表的user_id列上创建索引,在orders表的user_idproduct_id列上创建索引,在products表的product_idprice列上创建索引。这样在JOIN操作时,数据库可以快速定位匹配的行,减少全表扫描的次数。
    • 例如,在MySQL中可以使用CREATE INDEX idx_users_user_id ON users(user_id);等语句创建索引。
  2. 避免使用子查询嵌套:这里使用WITH子句(Common Table Expressions,CTE),它在执行效率上比多层子查询嵌套更好,因为CTE可以被复用,减少重复计算。
  3. 适当的表连接顺序:在实际执行中,数据库优化器会根据统计信息选择最优的表连接顺序。但一般来说,将数据量小的表放在JOIN的左边(在SQL语句书写顺序上)可能会有更好的性能,因为数据库在处理连接时通常从左到右进行。

性能优势解释

  1. 索引的作用:索引可以大大减少数据的扫描量,通过索引快速定位匹配的行,从而加速JOIN操作,提高查询效率。例如,对于orders表和users表通过user_id连接,如果orders表的user_id列有索引,数据库可以快速定位到users表中对应的用户行,而不需要逐行扫描users表。
  2. CTE的优势:相比子查询嵌套,CTE将计算用户总金额的逻辑封装在一个独立的部分,并且可以被后续查询复用,避免了子查询嵌套中可能出现的重复计算问题,使得查询逻辑更清晰,执行效率更高。
  3. 表连接顺序优化:合理的表连接顺序可以减少中间结果集的大小,从而减少内存和磁盘I/O的开销,提高查询性能。