Sql优化实战

简介: Sql优化实战

公众号merlinsea


  • 涉及的表
  • TRANSACTIONS
  • 表字段
  • TRANSACTION_ID唯一键
  • transaction_type记录类型 TRANSACTION_TYPE
  • TRANID订单号
  • CREATE_DATE创建时间
  • TRANSACTION_LINK
  • 表字段
  • APPLIED_TRANSACTION_ID子记录订单号,取自TRANSACTIONS表的TRANSACTION_ID
  • ORIGINAL_TRANSACTION_ID父记录订单号,取自TRANSACTIONS表的TRANSACTION_ID

640.png

  • 说明:TRANSACTIONS表中既有父记录也有子记录,哪个是子记录,哪个是父记录可以通过TRANSACTION_LINK表进行区分。
  • 需求

  • 给出若干订单号,如果订单号是子记录的id,则查询出这个子记录的信息以及和这个子记录相关的父记录的信息; 如果订单号是父记录的id,则查询出这个父记录的信息以及和这个父记录相关的子记录的信息。
  • 耗时sql


SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from transactions t 
left join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID 
left join TRANSACTIONS t1 on t1.transaction_id = l.ORIGINAL_TRANSACTION_ID 
-- WHERE l.APPLIED_TRANSACTION_ID in (${id}) or l.ORIGINAL_TRANSACTION_ID in (${id})
where t.tranid in (${id}) or t1.tranid in (${id})


sql执行结果[耗时200+]

640.png


  • 优化后的sql


-- 把输入id作为子记录id的查询条件
SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from(
  SELECT *
  from transactions
  where tranid in (${id})
) t
left join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID
left join transactions t1 on  t1.transaction_id = l.ORIGINAL_TRANSACTION_ID 
union
-- 把输入id作为父记录的查询条件
SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from(
  SELECT *
  from transactions
  where tranid in (${id})
) t1
left join TRANSACTION_LINKS l on t1.TRANSACTION_ID = l.ORIGINAL_TRANSACTION_ID
left join transactions t on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID


执行结果[耗时844毫秒]:

640.png


  • 优化思路
  • where条件往前提,把主表的记录数降低
  • or查询条件可以转化为union联合查询


算法vip班级训练营报名详情

奔跑的小梁,公众号:梁霖编程工具库算法训练营春节价格通知,2023年2月12日


相关文章
|
1天前
|
SQL 数据库
数据库SQL语言实战(六)
本次实战的重点就在于对表格本身的一些处理,包括复制表格、修改表格结构、修改表格数据
|
1天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
1天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
1天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(三)
本篇文章重点在于SQL中的各种删除操作
|
2天前
|
存储 SQL 关系型数据库
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
|
10天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
189 3
|
12天前
|
存储 SQL 缓存
30个业务场景的SQL优化
这些优化策略和示例可以帮助改善 `SQL` 查询的性能和效率。在实践中,需要综合考虑数据库设计、`SQL` 编写、服务器配置等多方面因素,选择合适的优化方法,并进行充分的测试和验证。以上 30 个经验是 V 哥在实际经验中总结的内容,当然,业务场景不同,具体的优化策略也会不同,按实际情况处理,这不就是程序员要做的事情么。
|
12天前
|
SQL 存储 算法
clickhouse SQL优化
clickhouse 是 OLAP 数据库,但其具有独特的索引设计,所以如果拿 MySQL 或者其他 RDB 的优化经验来优化 clickhouse 可能得不到很好的效果,所以特此单独整理一篇文档,用于有 SQL 优化需求的同学,本人接触 clickhouse 时间也不长,难免有不足的地方,如果大家发现错误,还请不吝指正。