2012-10-08 75 views
0

我有一個複雜的查詢,涉及LEFT JOIN語句中的子查詢。處理時間是〜2s。 如果我用一個臨時表替換子查詢,我碰到了相同的〜2s。 如果我在臨時表中創建一個索引,我有〜0.05s。無法在LEFT JOIN子查詢上強制使用INDEX?

我想弄清楚爲什麼我不能在LEFT JOIN STATEMENT中直接使用Mysql USE INDEX或FORCE INDEX。

這是一個簡單的查詢,它將返回'檢查你的MySQL語法'錯誤。

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); 

爲什麼我不能使用FORCE INDEX用LEFT JOIN子查詢?

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

我已經編輯了實際的代碼。 –