内联结或条件

时间:2019-11-19 11:56:16

标签: mysql optimization subquery inner-join

我有两个表,如下所示

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

  1. 从tb1 t1,tb2 t2中选择id,其中t1.id = t2.id_fk和(t1.originator = 40或t1.id in(从tb2中选择party_id = 40的id_fk))

    < / li>
  2. 从tb1 t1,tb2 t2中选择ID,其中t1.id = t2.id_fk和(t1.originator = 40或t2.partyId = 50)

,但是以上两个查询都花费大量时间处理200万条记录。

谁能帮助我优化此查询。

1 个答案:

答案 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