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

说明:TRANSACTIONS表中既有父记录也有子记录,哪个是子记录,哪个是父记录可以通过TRANSACTION_LINK表进行区分。
需求
给出若干订单号,如果订单号是子记录的id,则查询出这个子记录的信息以及和这个子记录相关的父记录的信息; 如果订单号是父记录的id,则查询出这个父记录的信息以及和这个父记录相关的子记录的信息。
耗时sql
SELECTl.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 tleft join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_IDleft 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+秒]

优化后的sql
-- 把输入id作为子记录id的查询条件SELECTl.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 transactionswhere tranid in (${id})) tleft join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_IDleft join transactions t1 on t1.transaction_id = l.ORIGINAL_TRANSACTION_IDunion-- 把输入id作为父记录的查询条件SELECTl.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 transactionswhere tranid in (${id})) t1left join TRANSACTION_LINKS l on t1.TRANSACTION_ID = l.ORIGINAL_TRANSACTION_IDleft join transactions t on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID
执行结果[耗时844毫秒]:

优化思路
where条件往前提,把主表的记录数降低
or查询条件可以转化为union联合查询
算法vip班级训练营报名详情
奔跑的小梁,公众号:梁霖编程工具库算法训练营春节价格通知,2023年2月12日
文章转载自奔跑的小梁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




