2017-02-22 2 views
1

쿼리가 40 분 이상 응답하는 데 너무 오래 걸립니다. 나는 또한 NOT으로 시도했다MySQL 쿼리가 너무 오래 응답하여 응답하지 않습니다.

`SELECT c.consumer_id FROM consumer c 
WHERE c.active_flag = 'Y' 
     AND (c.frequency = 'Q') 
     AND c.consumer_id NOT IN(
    SELECT consumer_id 
    FROM (SELECT s.consumer_id 
     FROM transactions s 
     WHERE (s.cycle='2016-Q-2') and s.active_flag = 'Y' AND s.status <> 'Door Locked') 
    AS subquery)` 

이 존재하고 좌/가입 둘 다에 대한 위의 쿼리 같은 시간 NULL 버전입니다.

consumer 테이블이

  • consumer_id의 VARCHAR (12)
  • active_flag의 VARCHAR (6)
  • 주파수 VARCHAR (2)와
  • 130000 행 WHERE 절
  • 전체 행 160000
  • 고유 인덱스가 소비자 ID
  • active_flag에 덱스

transaction 테이블이

  • consumer_id의 VARCHAR (12)
  • active_flag의 VARCHAR (6)
  • 상태 VARCHAR (20)
  • 사이클 VARCHAR (13)
  • 108000 where 절이있는 행
  • 총 행 270000
  • consumer_id 상태 및주기

서버 설정

-16GB RAM -8 코어 인텔 (R) 제온 (R) CPU 2.20GHz @ E5-4640 v2를 -MySQL 5.6.35

을에
  • 인덱스

    는 반환에게 SQL QUERY EXPLAIN

    난이 도움이되기를 바랍니다을 설명한다. 미리 감사드립니다.

    UPDATE 1

    소비자와 거래는이 일대 관계 모든주기 반복 할 것이다 그래서 consumer_id.

  • +0

    JOIN 쿼리도 추가 할 수 있습니까? – marijnz0r

    답변

    0

    내부 조인 나

    SELECT DISTINCT c.consumer_id FROM consumer c 
    INNER JOIN 
        (SELECT DISTINCT consumer_id as sid from transactions where consumer_id not in (
        select consumer_id from transactions 
        where cycle = '2016-Q-2' AND active_flag = 'Y' AND status != 'Door Locked' 
    )) as s 
    ON s.sid = c.consumer_id 
    WHERE c.active_flag = 'Y' AND (c.frequency = 'Q') 
    

    확실하지이 경우 올바른 방법에 대한 트릭을했지만 응답 시간은 지금 ~ 700ms까지입니다.

    왜 그런지는 모르겠지만 위의 모든 대답에서 나온 쿼리의 응답으로 모든 소비자 ID가 트랜잭션 테이블에서 사용 가능하게되었습니다.

    0

    왼쪽을 사용하면 얻을 것이다 가입 'NULL이'

    는 당신이

    SELECT c.consumer_id FROM consumer c 
    JOIN 
        (SELECT s.consumer_id as S_ID 
        FROM transactions s 
        WHERE (s.cycle='2016-Q-2') and s.active_flag = 'Y' AND s.status <> 
        'Door Locked') 
    ON s.S_ID <> c.consumer_id 
    WHERE c.active_flag = 'Y' AND (c.frequency = 'Q') 
    
    0

    를 사용하여 잘 센터 도움이나 내부가 원하는 결과를 얻기 위해 가입 할 수있다 가입 내부로 시도 값. 쿼리 속도를 높이려면 WHERE 절의 모든 필드에 인덱스를 추가해야합니다. 행운을 빕니다!

    SELECT DISTINCT c.consumer_id FROM consumer c 
    INNER JOIN transactions s 
    ON s.cycle != '2016-Q-2' AND s.active_flag != 'Y' AND s.status = 'Door Locked' 
    WHERE c.active_flag = 'Y' 
    AND c.frequency = 'Q' 
    
    0

    그래서 내가 확실하지 오전처럼 다음은 작동하지만 당신이 당신의 쿼리의 기본 논리를 연주 할 수 있습니다 경우 데이터가 보이는 것을 확실하지 않다 당신이없이 달성해야 할 무엇을 찾고 있기 때문에 하위 쿼리 사용

    대개 매우 비효율적이므로 하위 쿼리를 사용하지 않으려 고합니다.