MySQL中的左连接索引

时间:2018-03-27 09:10:12

标签: mysql sql join left-join

我是Mysql的新手,我试图在2个表之间进行左连接,但这需要很长时间才能完成。

我想我可能会在我的noob查询中遗漏一些东西。我不知道索引如何工作得很好,但我认为每个连接列都必须有索引。

首先,我为连接列(MANDT,KUNNR,POSNR,MODAT)创建索引,以及将要连接到另一个表的列。

CREATE INDEX aux03_financiero_idx ON aux03_financiero (ESTAD, TIPPTO, MANDT,  KUNNR, POSNR, MODAT, DPTOCODE, SW_RRHH); 

我还在表上创建了我希望拥有所有列的索引。

CREATE INDEX aux71_idx ON aux71 (MANDT,KUNNR, POSNR, MODAT);

在加入列上创建索引后,我运行查询,但永远不会结束。

每个表都包含aprox。 3M排,所以它不是一张大桌子。 Mysql应该可以用任何probs来做到这一点。没有创建任何外键或主键,但我认为索引应该这样做。

CREATE TABLE FINANCIERO71 as select 
        A.MANDT,
        A.KUNNR,
        A.MODAT,
        A.POSNR,
        A.MODAT_R,
        A.MOV_TYPE,
        B.ESTAD,
        A.ORIG as hotel_ori,
        A.DESt as hotel_des,
        case when A.ORIG!='' then substring(A.ORIG,1,2)
            else substring(B.DPTOCODE,1,2) end as pais_origen,
        B.TIPPTO,
        B.DPTOCODE,
        B.SW_RRHH,
        A.PUNTOS,
        B.PUNTOS2,
        A.CANC,
        A.DATUM,
        A.UZEIT,
        A.NUMMOV,
        A.NUMMOV_ORIG,
        A.FECHA_CANC, 
        A.FECHA_CADUC,
        A.modat_mes,
        A.modat_ano,
        A.prombasic,
        substring(A.FECHA_CADUC,1,6) as modat_caduc_mes,
        substring(A.FECHA_CANC,1,6) as modat_cancel_mes,
        A.MarcaH
From aux71 as A
left join aux03_financiero as B
    on A.MANDT = B.MANDT 
    AND A.KUNNR = B.KUNNR
    AND A.MODAT = B.MODAT 
    AND A.POSNR = B.POSNR;

真的很感谢你的帮助。如果您需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

您想要的索引是:

CREATE INDEX aux03_financiero_idx ON aux03_financiero (MANDT, KUNNR, MODAT, POSNR);

这些是用于连接的列,它们需要是索引中的第一列。您可以在这些列之后添加其他列以及,但这可以显着提高您的效果。