2014-09-24 2 views
0

이 질문은 the back of one I asked earlier today에 있습니다. 대답은 내가 내 문제를 해결했기 때문에 반환 된 행을 제한함으로써 내가 원하는 것을 수행 할 수 있음을 알 수 있습니다.LEFT 조인 및 조인 조건에 대한보다 효율적인 SELECT 쿼리 만들기

하지만 지금은 제한없이 분석을 위해 Excel로 내보내기의 목적으로 전체 쿼리를 실행하려고 할 때 아무 것도 얻을 수없는 것처럼 보입니다. MySQL Workbench가 내 암호를 다시 묻고 질의가 실행을 멈춘다는 점에서 SQL을 시작합니다. 나는 그 정보가 뭔가 다른 일이 벌어지고 있는지와 나의 실제 질문에서 "어떻게하면이 쿼리가 더 빨리 실행되도록 할 수 있습니까?"라는 것을 알지 못합니다. 현재 그것은 적어도 5 분 동안 뛰기 전에 실행됩니다.

여기 쿼리가 제공되는 것입니다 EXPLAIN 경우 :

1 SIMPLE co ALL     185610 Using temporary; Using filesort 
1 SIMPLE my ref PRIMARY PRIMARY 4 bm_emails.co.id 23 
1 SIMPLE nvk eq_ref PRIMARY PRIMARY 4 bm_emails.co.id 1 

아마도입니다 원인 임시 테이블 문제가하지만 난 내 쿼리를 유지하면서 그것을 극복하는 방법을 확실 해요 "임시 사용" . 실제 쿼리가 여기에 있습니다 :

SELECT 
    co.email, 
    nvk.nvk_medium, 
    CAST(MIN(co.created) AS DATE) AS first_contact, 
    MIN(CASE WHEN my.my_id = 581 THEN my.data END) AS WA_Created, 
    MIN(CASE WHEN my.my_id = 3347 THEN my.data END) AS WA_Upgraded 
FROM bm_emails.cid208 co 
LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND (my_id = 581 OR my_id = 3347) 
LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id 
GROUP BY email 
+0

좋은 하루에 Myworkbench가 희박합니다 ... 여기에있는 SQL은 group by 절 (nvk.nvk_medium은 집계가 아니거나 group by 절에 있습니다 ... 다른 데이터베이스는에 대한 오류를 반환합니다. 그것),하지만 그 성능에 영향을 볼 수 없습니다. 테이블이 얼마나 큽니까? – Twelfth

답변

0

내가 bm_emails 이메일 당 하나 개의 행이 포함되어 있다고 가정하면, 다음이 빨리 갈 수 있습니다 이것은 다음과 같은 인덱스를 활용할 수

select co.email, 
     (select nvk.nvk_medium from bm_emails.nvk208 nvk where nvk.eid = co.id limit 1) as nvk_medium, 
     co.created, 
     (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 581) as WA_Created, 
     (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 3347) as WA_Updated 
from bm_emails.cid208 co; 

:

bm_emails.nvk208(eid, nvk_medium) 
bm_emails.my208(eid, mid, data) 

물론 첫 번째 테이블에는 이메일 당 하나의 행이 있습니다.

편집 :

은 심지어 여러 이메일로, 나는 아직도이 시도 것 :

select cn.mail, cn.nvk_medium, cn.created, 
     (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 581) as WA_Created, 
     (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 3347) as WA_Updated 
from (select co.email, nvk.nvk_medium, min(co.created) as created 
     from bm_emails.cid208 co left join 
      bm_emails.nvk208 nvk 
      on nvk.eid = co.id 
     group by co.email, nvk.nvk_medium 
    ) cn; 
+0

전자 메일 그룹에 의해 성명에 의해 판단, 나는 그것을 이메일 당 1 행이라고 생각하지 않습니다. Little은 일련의 subselect가 mysql에서 더 빨리 실행될 수 있다는 것을 알고 놀랐습니다. 인덱스를보다 효율적으로 사용하는 것 같습니다. – Twelfth

+0

@twelfth가 정확합니다. 해당 테이블에 여러 개의 이메일 인스턴스가 있습니다. –

+0

@ Twelfth. . . 전혀. 상관 된 하위 쿼리는 전체 테이블에서 집계에 필요한 매우 큰 외부 파일 정렬을 방지 할 수 있습니다. 또한 인덱스를 활용할 수 있습니다. –

1

연합 (EU) 모든 자주 조인 조건에 OR을 사용하여보다 빠른 선택이 될 것입니다. 데이터 결과를 확인해 보면, 내부 조인은 UNON을 사용하는 것이 더 이해할 만하지만 데이터를보아야 할 것이라고 생각합니다.

SELECT email,nvk_medium, CAST(MIN(created) AS DATE) AS first_contact,WA_Created,WA_Upgraded 
FROM 
(
    SELECT 
     co.email, 
     nvk.nvk_medium, 
     co.created AS first_contact, 
     my.data AS WA_Created, 
     NULL AS WA_Upgraded 
    FROM bm_emails.cid208 co 
    LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND my_id = 581 
    LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id 
    UNION ALL 
    SELECT 
     co.email, 
     nvk.nvk_medium, 
     co.created AS first_contact, 
     NULL AS WA_Created, 
     my.data AS WA_Upgraded 
    FROM bm_emails.cid208 co 
    LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND my_id = 3347 
    LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id 
) a 
GROUP BY email,nvk_medium,WA_Created,WA_Upgraded 

나는 또한 고려할 것 : 나는 또한 당신이 MY_ID 581 또는 3347.

이 시도 대한 myid에 대해 하나 기록에 가입 할 것이라고 bm_emails.cid208에서 레코드를보고 싶어 whter에 대한 자세한 내용을 알고 싶은 것 CAST (MIN (created) AS DATE)가 작성된 필드의 데이터 유형에 따라 Min (CAST (AS DATE 작성))이어야합니다. 문자열 기반 필드의 일부 유형이 있다면 2014 년 10 월 20 일은 2013 년 2 월 24 일보다 작아서 선택됩니다. 뭔가 datetime 유형의 필드에 저장되어 있고 단순히 시간을 절약하는 경우에도 괜찮습니다.

+0

고마워요. 나는 똑같은 일이 벌어 지도록 시도 했었습니다. 잠시 동안 뛰쳐 나와서 저를 쫓아 냈습니다. 주목할만한 점은, 그룹화 기준 및 nvk_medium 필드에 대한 @ Twelfth의 의견입니다. 쿼리는 (Bad SQL?)에 의해 nvk_medium을 그룹에 추가하지 않고 실행됩니다. 하지만 추가하지 않으면 (또는 적절한 시간대에) 실행되지 않습니다. 그것은 해결책을 암시 하는가? 그것은 nvk_medium 필드입니다 –

+0

당신은 당신이 가지고있는 색인을 게시하시오. – HLGEM