2012-10-08 49 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

我已经编辑了实际的代码。 –