公众号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
- 说明: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+秒]
- 优化后的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毫秒]:
- 优化思路
- where条件往前提,把主表的记录数降低
- or查询条件可以转化为union联合查询
算法vip班级训练营报名详情
奔跑的小梁,公众号:梁霖编程工具库算法训练营春节价格通知,2023年2月12日