0

だから私はこのクエリに問題があります

SELECT e.entreprise, e.entreid, e.chargee, e.date, e.tel, e.email, e.adresse, e.ville,
e.codepostal, e.fax, e.accronyme, GROUP_CONCAT(c.nom, c.prenom, c.email separator ',') as keywords 
FROM contacts as c
LEFT JOIN entreprise as e ON e.entreid=c.contactid
LEFT JOIN metas as m ON e.entreid=m.elem_id
WHERE  e.entreid !=1 AND e.actif!='inactif' 
     AND ((m.meta_key='type_entreprise' 
     AND m.meta_value REGEXP '(client)') 
     OR m.meta_key is null) 
GROUP BY e.entreid  ORDER BY e.entreprise ASC

このクエリは、クライアントであるすべてのエンタープライズを返すと想定されています... 問題は、クライアントを作成するフィールドがメタテーブルにあり (LIKE 9000 エントリとエンタープライズの多く)、このクエリを実行すると実行するのに約70秒。

誰かが助けてくれれば幸いです

4

2 に答える 2

0

EXPLAIN を見ると、メタテーブルでインデックスが使用されていません。

meta_key と elem_id の両方の 2 つの列で複合キーを試してください

クエリに関しては、次のようにしてみてください:-

SELECT e.entreprise, e.entreid, e.chargee, e.date, e.tel, e.email, e.adresse, e.ville,
e.codepostal, e.fax, e.accronyme, GROUP_CONCAT(c.nom, c.prenom, c.email separator ',') as keywords 
FROM contacts as c
LEFT JOIN entreprise as e 
ON e.entreid = c.contactid
LEFT JOIN metas as m 
ON e.entreid = m.elem_id
AND m.meta_key = 'type_entreprise' 
AND m.meta_value REGEXP '(client)' 
WHERE e.entreid !=1 
AND e.actif!='inactif' 
GROUP BY e.entreid  
ORDER BY e.entreprise ASC

戻すフィールドのほとんどがそのテーブルからのものであることを考えると、エンタープライズに対して LEFT JOIN を持つことは論理的ではないようです。エンタープライズに常にレコードが必要な場合は、それを INNER JOIN に変更して、そのインデックスを使用できるようにし、そこから連絡先に変更します。

SELECT e.entreprise, e.entreid, e.chargee, e.date, e.tel, e.email, e.adresse, e.ville,
e.codepostal, e.fax, e.accronyme, GROUP_CONCAT(c.nom, c.prenom, c.email separator ',') as keywords 
FROM entreprise as e 
INNER JOIN contacts as c
ON e.entreid = c.contactid
LEFT JOIN metas as m 
ON e.entreid = m.elem_id
AND m.meta_key = 'type_entreprise' 
AND m.meta_value REGEXP '(client)' 
WHERE e.entreid !=1 
AND e.actif!='inactif' 
GROUP BY e.entreid  
ORDER BY e.entreprise ASC
于 2013-07-30T15:31:05.343 に答える
0

わかりましたので、cars10 からのコメントを使用して、クエリ時間を 70 秒から 2.2 秒に短縮することができました。それが正しいことかどうかはわかりませんが、うまくいくようです。

これが新しいクエリです

CREATE TEMPORARY TABLE temptable AS (SELECT m.meta_value, m.elem_id FROM metas as m WHERE m.meta_key='type_entreprise');
SELECT e.entreprise, e.entreid, e.chargee, e.date, e.tel, e.email, e.adresse, e.ville,     e.codepostal, e.fax, e.accronyme, GROUP_CONCAT( c.nom, c.prenom, c.email
SEPARATOR ',' ) AS keywords, temp.meta_value
FROM contacts AS c
LEFT JOIN entreprise AS e ON e.entreid = c.contactid
LEFT JOIN temptable AS temp ON temp.elem_id = e.entreid
WHERE e.entreid !=1
AND e.actif != 'inactif'
AND temp.meta_value REGEXP "(client)"
GROUP BY e.entreid
ORDER BY e.entreprise ASC
于 2013-07-31T14:51:00.453 に答える