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;
하위 쿼리가 어떤 이유가 있습니까? 아니면 방금 발생한 문제를 확인하기 위해 사용 했습니까? 나는 정말로 그곳에 대한 필요성을 느끼지 않는다. –
"복잡한"쿼리입니까? 아니면 거기에 복잡한 짐승이 있습니까? (이 경우 게시하십시오). –
예제 코드를 mysql 오류를 반환하는 간단한 예제로 사용했습니다. 물론 실제 코드는 그보다 훨씬 복잡하고 하위 쿼리가 필요합니다. –