系统里这个同时查冷热表的sql,动动手指,从8s降到3s

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 系统将交易数据按交易时间分为热表(最近3个月)和冷表(3个月前)。为保证用户体验,当企业门户端查询跨越冷热表时,尤其针对大客户,查询性能优化至关重要。以下是程序的SQL查询语句及其优化版本。

系统里的交易数据按交易时间做了冷热表分离(热表仅存储最近3个月的交易数据,3个月前的交易数据自动结转至冷表),我们内部运营系统的交易查询功能进行了冷热数据分开查询。

然后企业客户端呢,为了不影响用户体验,企业门户端的交易查询功能,当选择的查询时间段同时涉及到冷热表时,需要union(合并)两表进行数据查询。这时,尤其是针对那些交易量比较大的客户来说,在查询性能上我们就要做一些努力。

上sql

select
  count(*) as orderNum,
  IFNULL(sum(amount), 0) as totalAmt,
  SUM(CASE WHEN order_status = 'SUCCESS' THEN amount ELSE 0 END) as totalSuccessAmt,
  SUM(CASE WHEN order_status = 'FAIL' THEN amount ELSE 0 END) as totalFailAmt
from
  (
    select
      *
    from
      order_detail
    WHERE
      enterprise_id = 1655100723787649
      and create_time >= '2024-02-04 00:00:00'
      and create_time <= '2024-09-20'
    UNION
    select
      *
    from
      order_detail_mig
    WHERE
      enterprise_id = 1655100723787649
      and create_time >= '2024-02-04 00:00:00'
      and create_time <= '2024-09-20'
  ) od

### 执行计划及耗时

本文sql查询方式:本地通过堡垒机访问生产库,执行耗时15s。(生产log实际耗时≈12s)

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1 PRIMARY <derived2> (null) ALL (null) (null) (null) (null) 403059 100 (null)
2 DERIVED order_detail (null) ref uk_enterprise_order_no,idx_create_time,idx_create_time_payee_account_enterprise_id uk_enterprise_order_no 8 const 376527 50 Using where
3 UNION order_detail_mig (null) ref uk_enterprise_order_no,idx_create_time uk_enterprise_order_no 8 const 429592 50 Using where
4 UNION RESULT <union2,3> (null) ALL (null) (null) (null) (null) (null) (null) Using temporary

image.png


sql优化后v1

先把`UNION`换成`UNION ALL`

### 执行计划及耗时

image.png


sql优化后v2

select
    count(*) as orderNum,
    sum(amount) as totalAmt,
    order_status
from
  order_detail
WHERE
  enterprise_id = 1655100723787649
  and create_time >= '2024-02-04 00:00:00'
  and create_time <= '2024-09-20'
group by order_status
UNION ALL
select
    count(*) as orderNum,
    sum(amount) as totalAmt,
    order_status
from
  order_detail_mig
WHERE
  enterprise_id = 1655100723787649
  and create_time >= '2024-02-04 00:00:00'
  and create_time <= '2024-09-20'
group by order_status


### 执行计划及耗时

image.png


目录
相关文章
|
SQL 关系型数据库 MySQL
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
Linux系统部署Yearning SQL审核平台结合内网穿透实现公网访问
186 0
|
1月前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。
|
11月前
|
SQL 存储 测试技术
SQL在构建系统中的应用:关键步骤与技巧
在构建基于数据库的应用系统时,SQL(Structured Query Language)作为与数据库交互的核心语言,扮演着至关重要的角色
|
11月前
|
SQL 存储 数据库
SQL在构建系统中的应用:关键要素与编写技巧
在构建基于数据库的系统时,SQL(Structured Query Language)扮演着至关重要的角色
|
11月前
|
SQL 数据库连接 数据库
管理系统中的Visual Studio与SQL集成技巧与方法
在现代软件开发和管理系统中,Visual Studio(VS)作为强大的集成开发环境(IDE),与SQL数据库的紧密集成是构建高效、可靠应用程序的关键
|
11月前
|
SQL 监控 数据库
管理系统VS SQL:高效集成的关键技巧与方法
在现代企业信息化建设中,管理系统(如ERP、CRM等)与SQL数据库之间的紧密集成是确保数据流动顺畅、业务逻辑高效执行的关键
|
SQL 安全 API
PHP代码审计示例(一)——淡然点图标系统SQL注入漏洞审计
PHP代码审计示例(一)——淡然点图标系统SQL注入漏洞审计
319 4
|
前端开发 Java JSON
Struts 2携手AngularJS与React:探索企业级后端与现代前端框架的完美融合之道
【8月更文挑战第31天】随着Web应用复杂性的提升,前端技术日新月异。AngularJS和React作为主流前端框架,凭借强大的数据绑定和组件化能力,显著提升了开发动态及交互式Web应用的效率。同时,Struts 2 以其出色的性能和丰富的功能,成为众多Java开发者构建企业级应用的首选后端框架。本文探讨了如何将 Struts 2 与 AngularJS 和 React 整合,以充分发挥前后端各自优势,构建更强大、灵活的 Web 应用。
153 0
|
SQL 数据采集 算法
【电商数据分析利器】SQL实战项目大揭秘:手把手教你构建用户行为分析系统,从数据建模到精准营销的全方位指南!
【8月更文挑战第31天】随着电商行业的快速发展,用户行为分析的重要性日益凸显。本实战项目将指导你使用 SQL 构建电商平台用户行为分析系统,涵盖数据建模、采集、处理与分析等环节。文章详细介绍了数据库设计、测试数据插入及多种行为分析方法,如购买频次统计、商品销售排名、用户活跃时间段分析和留存率计算,帮助电商企业深入了解用户行为并优化业务策略。通过这些步骤,你将掌握利用 SQL 进行大数据分析的关键技术。
750 0