2012-10-08 2 views
0

LEFT JOIN 문 안에 하위 쿼리가 포함 된 복잡한 쿼리가 있습니다. 처리 시간은 ~ 2 초입니다. 하위 테이블을 임시 테이블로 바꾸면 같은 ~ 2 초가 걸립니다. 임시 테이블에 인덱스를 만들면 ~ 0.05 초가 있습니다.LEFT JOIN 하위 쿼리에서 FORCE INDEX를 사용할 수 없습니까?

나는 LEFT JOIN STATEMENT에서 Mysql USE INDEX 또는 FORCE INDEX로 작업 할 수없는 이유를 알아 내려고하고있다.

다음은 'mysql 구문 확인'오류를 반환하는 간단한 쿼리입니다. 나는 왼쪽으로 힘 INDEX를 사용할 수없는 이유

SELECT * 
FROM table1 t1 
LEFT JOIN (SELECT id_project FROM table2) t2 
FORCE INDEX FOR JOIN (id_project) 
    ON (t2.id_project = t1.id_project); 

는 서브 쿼리 가입?

--edit : 여기에 실제 쿼리는 MySQL의 오류

SELECT 
    p.id_projet, pa.piste_affaire, ty.type, p.e_force, gr.groupe, p.client, p.intitule_affaire, 
    ag.agence, st.statut, p.winratio, p.justification_nogo, p.webdoc, sp.sponsor, dis.domain_is, 
    cons.constructeur, p.date_chgt_statut, p.date_creation, 
    p.ca_estimatif, p.tcv, p.marge, 
    tarp.target_price, p.marketable_price, 
    p.remise_propal_initiale, p.remise_propal_reel, 
    p.date_de_signature, p.debut_build, p.fin_build, 
    his.date, his.login, co.contrat, 
    p.duree_contrat, p.fqp, cap.capitalisation, 
    p.international, p.risk_management, p.asi, 
    GROUP_CONCAT(com.commentaire,',') AS COMMENT 

FROM 
    piste_affaire pa, statut st, TYPE ty, agence ag, 
    domain_is dis, sponsor sp, constructeur cons, groupe gr, 
    target_price tarp, contrat co, historique his, capitalisation cap, 
    projet p 
    LEFT JOIN commentaire com ON (p.id_projet=com.id_projet) 
    LEFT JOIN bizdev bizd ON (p.id_bizdev = bizd.id_bizdev) 
    LEFT JOIN (SELECT eco_projet.id_projet, 
       GROUP_CONCAT(
       CONCAT(ecosysteme) 
       ORDER BY ecosysteme SEPARATOR ', ') AS ecosysteme 
       FROM ecosysteme NATURAL JOIN eco_projet, projet 
       WHERE eco_projet.id_projet = projet.id_projet 
       GROUP BY eco_projet.id_projet) AS tmpeco 
       /* if I delete that line, everything works as intended with ~2s query*/ 
       FORCE INDEX FOR JOIN (id_projet) 
       /* ** */ 
     ON (tmpeco.id_projet = p.id_projet) 

WHERE 
    ag.id_division != 2 AND 
    dis.id_division != 2 AND 
    st.id_division != 2 AND 
    pa.id_division != 2 AND 
    cons.id_division != 2 AND 
    p.type_division = 1 AND 
    pa.id_piste_affaire = p.id_piste_affaire AND 
    p.id_statut = st.id_statut AND 
    p.id_type = ty.id_type AND 
    p.id_agence = ag.id_agence AND 
    p.id_domain_is = dis.id_domain_is AND 
    p.id_sponsor = sp.id_sponsor AND 
    p.id_constructeur = cons.id_constructeur AND 
    p.id_groupe = gr.id_groupe AND 
    p.id_target_price = tarp.id_target_price AND 
    p.id_contrat = co.id_contrat AND 
    p.id_projet = his.id_projet AND 
    p.id_capitalisation = cap.id_capitalisation 
GROUP BY p.id_projet; 
+0

하위 쿼리가 어떤 이유가 있습니까? 아니면 방금 발생한 문제를 확인하기 위해 사용 했습니까? 나는 정말로 그곳에 대한 필요성을 느끼지 않는다. –

+0

"복잡한"쿼리입니까? 아니면 거기에 복잡한 짐승이 있습니까? (이 경우 게시하십시오). –

+0

예제 코드를 mysql 오류를 반환하는 간단한 예제로 사용했습니다. 물론 실제 코드는 그보다 훨씬 복잡하고 하위 쿼리가 필요합니다. –

답변

1

왜 하위 쿼리를 반환? 이 시도 : 당신은 아마 위의 쿼리로 인덱스를 강제 할 필요가 없습니다

SELECT * 
FROM table1 t1 
LEFT JOIN table2 t2 
FORCE INDEX FOR JOIN (id_project) 
ON (t2.id_project = t1.id_project); 

.

+0

실제 코드를 편집했습니다. –