我有两个表,如下所示
1. Table tb1
===============================
id name originator
1 xyz 40
2 abc 40
3 xyz1 50
4 abc1 60
2. Table tb2
=======================================
id_fk partyId permission
1 40 admin
1 41 user
2 43 user
3 40 admin
3 67 user
3 88 admin
4 40 admin
4 51 user
我需要编写一个查询,该查询将带有其发起者40或partyId为40的ID
从tb1 t1,tb2 t2中选择id,其中t1.id = t2.id_fk和(t1.originator = 40或t1.id in(从tb2中选择party_id = 40的id_fk))
< / li>从tb1 t1,tb2 t2中选择ID,其中t1.id = t2.id_fk和(t1.originator = 40或t2.partyId = 50)
,但是以上两个查询都花费大量时间处理200万条记录。
谁能帮助我优化此查询。
答案 0 :(得分:1)
最好通过并集查询来处理此问题,以便分别在每个部分上优化索引
select DISTINCT
tb1.id
from
tb1
where
tb1.originator = 40
UNION
select
tb2.id_fk as id
from
tb2
where
tb2.PartyID = 40
我将在您的表上包含以下索引
Table Index
TB1 (Originator, id)
TB2 (PartyID, id_fk)
无论有多少条记录(例如TB2中给定人员的多个详细记录),对于任何给定的ID,select唯一性都将仅返回一条记录。还有基于发起人的TB1中的那些。
如果您想要这些人的名字,则可以将其包装起来以根据结果ID获得名字。
您在直接给我的评论中提到一个命令和一个限制,但没有澄清。订购的依据是什么。您是否想取名字?还有限制...请通过编辑其他人的原始帖子来提供更多信息。但是,我只能通过
进行调整select
PQ.*
from
( entire query above ) PQ
order by
PQ.ID
limit
0,15