2013-07-19 3 views
-1

원하는 결과를 생성하는 쿼리가 매우 천천히 실행됩니다. (! 600초 같은)MySQL의 인덱싱 종속 하위 쿼리

SELECT * 
FROM clients 
WHERE type = 'gold' 
     AND state IN('TX', 'WV', 'NV', 'IL') 
AND phone not in 
     (
      select phone 
      from clients 
      group by phone 
      having count(*) > 1 
     ) 
AND cell not in 
     (
      select cell 
      from clients 
      group by cell 
      having count(*) > 1 
     ) 

SELECT 나에게 부여 EXPLAIN : 내가 여기에 무엇을해야하는지 고민하고

id, select_type, table, Possible_keys, key, key_len, ref, rows, Extra 
1, PRIMARY, clients, ALL, ndxCLients_state,IGA_Count, , , , 128070, Using where 
2, DEPENDENT SUBQUERY, clients, ALL, , , , , 128070, Using temporary; Using filesort 
3, DEPENDENT SUBQUERY, clients, index, , idx_Cell, 258, , 3, Using index 

. 나는 그것이 내가 전화 분야에 대한 색인이 필요하다는 것을 말해 주려한다고 생각한다. mysql workbench를 사용하여 전화 필드를 인덱싱했습니다. 내가 여기서 무엇을 놓치고 있니? 사용 LEFT이 가입

+0

** 테이블 및 인덱스 정의를 표시해야합니다. ** 느린 쿼리를 진단하려면 설명이나 의역이 아닌 전체 테이블 및 인덱스 정의가 필요합니다. 테이블이 잘못 정의 된 것일 수 있습니다. 색인이 올바르게 작성되지 않았을 수 있습니다. 어쩌면 그 칼럼에 당신이 생각한 색인이 없을 수도 있습니다. 테이블과 인덱스 정의를 보지 않고는 말할 수 없습니다. –

+0

감사합니다. Andy. 나는 그것을 두려워했다. 큰 못생긴 제작 데이터베이스를 배우면서 아프다는 트림과 컴팩트 버전이 필요합니다. – JVMX

+0

은 https://www.sqlfiddle.com을 사용하고 작은 데이터 세트로 클라이언트 테이블 만 넣습니다. – amaster

답변

0

더 이상 INNOT IN

SELECT c.* 
FROM clients c 
LEFT JOIN (SELECT phone 
      FROM clients 
      GROUP BY phone 
      HAVING COUNT(*) > 1) p 
ON c.phone = p.phone 
LEFT JOIN (SELECT cell 
      FROM clients 
      GROUP BY cell 
      HAVING COUNT(*) > 1) cl 
ON c.cell = p.cell 
WHERE p.phone IS NULL AND cl.cell IS NULL 
AND type = 'gold' 
AND state IN('TX', 'WV', 'NV', 'IL') 

당신이 phonecell에 인덱스가 있는지 확인 종종있다. type 및/또는 state의 인덱스가 더 유용한 지 여부에 따라 JOIN에 사용될 수도 있고 사용되지 않을 수도 있지만 하위 쿼리에서 GROUP BY을 최적화하는 데 사용됩니다.