当前位置: 首页 > article >正文

分享一些成功的 SQL 优化案例

案例一:电商平台订单查询优化

背景
一家电商企业的数据库中存储了大量的订单数据,随着业务的增长,订单查询的响应时间越来越长,影响了客服人员处理订单查询以及生成报表的效率。

原始 SQL 查询语句

sql

SELECT o.order_id, o.customer_id, o.order_date, od.product_id, od.quantity, od.price
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
WHERE o.order_date BETWEEN '2024-01-01' AND '2024-09-02';

分析问题

  • 没有合适的索引:最初的数据库表结构中,orders 表的 order_date 列和 order_details 表的 order_id 列上没有创建合适的索引,导致在进行日期范围查询和连接操作时,数据库需要进行全表扫描。
  • 数据量大:经过一段时间的运营,订单数据量已经增长到数百万条,全表扫描的时间成本非常高。

优化措施

  • 创建索引:在 orders 表的 order_date 列上创建索引,以便快速筛选出符合日期范围的订单。在 order_details 表的 order_id 列上创建索引,提高连接操作的效率。

sql

CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_order_id ON order_details(order_id);

  • 优化查询语句:使用更明确的连接条件和筛选条件,避免不必要的数据返回。例如,只选择需要的列,而不是使用 SELECT *

sql

SELECT o.order_id, o.customer_id, o.order_date, od.product_id, od.quantity, od.price
FROM orders o
INNER JOIN order_details od ON o.order_id = od.order_id
WHERE o.order_date >= '2024-01-01' AND o.order_date <= '2024-09-02'
AND o.status = 'completed';  -- 添加了订单状态筛选条件

优化效果
查询响应时间从原来的几十秒缩短到了几秒钟,大大提高了客服人员和数据分析师的工作效率。

案例二:社交媒体平台用户活动查询优化

背景
一个社交媒体平台需要统计用户在一段时间内的点赞、评论和分享等活动数据,以便进行用户行为分析和内容推荐。但是,原始的查询语句执行非常缓慢,影响了数据分析的及时性。

原始 SQL 查询语句

sql

SELECT u.user_id, u.username, 
       COUNT(l.like_id) AS like_count,
       COUNT(c.comment_id) AS comment_count,
       COUNT(s.share_id) AS share_count
FROM users u
LEFT JOIN likes l ON u.user_id = l.user_id
LEFT JOIN comments c ON u.user_id = c.user_id
LEFT JOIN shares s ON u.user_id = s.user_id
WHERE u.last_active_date BETWEEN '2024-08-01' AND '2024-09-02'
GROUP BY u.user_id, u.username;

分析问题

  • 大量的连接操作:原始查询语句中使用了多个左连接来关联用户表和点赞、评论、分享表,这在数据量大的情况下会导致大量的中间结果集和复杂的连接计算。
  • 缺乏合适的索引:用户表的 last_active_date 列和关联表的 user_id 列上没有索引,导致在进行筛选和连接时效率低下。

优化措施

  • 分解查询:将一个复杂的查询分解为多个简单的子查询,先分别计算点赞、评论和分享的数量,然后再与用户表进行合并。

sql

-- 计算点赞数量的子查询
SELECT user_id, COUNT(like_id) AS like_count
FROM likes
WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
GROUP BY user_id;

-- 计算评论数量的子查询
SELECT user_id, COUNT(comment_id) AS comment_count
FROM comments
WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
GROUP BY user_id;

-- 计算分享数量的子查询
SELECT user_id, COUNT(share_id) AS share_count
FROM shares
WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
GROUP BY user_id;

-- 将子查询结果与用户表合并
SELECT u.user_id, u.username, l.like_count, c.comment_count, s.share_count
FROM users u
LEFT JOIN (
    SELECT user_id, COUNT(like_id) AS like_count
    FROM likes
    WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
    GROUP BY user_id
) l ON u.user_id = l.user_id
LEFT JOIN (
    SELECT user_id, COUNT(comment_id) AS comment_count
    FROM comments
    WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
    GROUP BY user_id
) c ON u.user_id = c.user_id
LEFT JOIN (
    SELECT user_id, COUNT(share_id) AS share_count
    FROM shares
    WHERE create_date BETWEEN '2024-08-01' AND '2024-09-02'
    GROUP BY user_id
) s ON u.user_id = s.user_id
WHERE u.last_active_date BETWEEN '2024-08-01' AND '2024-09-02';

  • 创建索引:在用户表的 last_active_date 列以及点赞、评论、分享表的 user_id 和 create_date 列上创建索引。

sql

CREATE INDEX idx_users_last_active_date ON users(last_active_date);
CREATE INDEX idx_likes_user_id ON likes(user_id);
CREATE INDEX idx_likes_create_date ON likes(create_date);
CREATE INDEX idx_comments_user_id ON comments(user_id);
CREATE INDEX idx_comments_create_date ON comments(create_date);
CREATE INDEX idx_shares_user_id ON shares(user_id);
CREATE INDEX idx_shares_create_date ON shares(create_date);

优化效果
查询执行时间从原来的几分钟缩短到了十几秒钟,使得数据分析人员能够更及时地获取用户活动数据,为平台的运营决策提供了有力支持。


了解更多跨境独立站电商代购系统和国内外电商API,可以私信或评论区交流 ,感谢你的关注。


http://www.kler.cn/a/306561.html

相关文章:

  • 基于 Python Django 的二手房间可视化系统分析
  • 论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
  • 【常见问题解答】远程桌面无法复制粘贴的解决方法
  • Java 多线程(三)—— 死锁
  • 【算法一周目】双指针(2)
  • UDP协议和TCP协议之间有什么具体区别?
  • 2024工业机器视觉产业现状
  • 多模态大语言模型综述(中)-算法实用指南
  • 如何在Django中创建新的模型实例
  • MFC工控项目实例之十六输入信号验证
  • app抓包 chrome://inspect/#devices
  • 2024.9.12(k8s环境搭建2)
  • WebSocket vs. Server-Sent Events:选择最适合你的实时数据流技术
  • VUE3中ref与reactive
  • Sentinel 安装
  • BSV区块链上的覆盖网络服务现已开放公测
  • 常回家看看之house_of_cat
  • 基于单片机的超声波液位检测系统(论文+源码)
  • STM32 HAL freertos零基础(二)-通过STM32CubeMX配置Freertos后在程序中进行任务创建,便于任务管理与识别。
  • 微服务保护之熔断降级
  • 【前端】ref引用的作用
  • 2----手机维修工具 集合解锁 修复参数 刷机支持高通 MTK 展讯等芯片 支持一些PDA设备
  • 【机器学习】--- 生成对抗网络 (GANs)
  • Linux-Swap分区使用与扩容
  • Java集合接口List
  • C Primer Plus 第5章习题