또는

2013-03-08 3 views
2

으로 쿼리 최적화 세 개의 테이블을 결합해야합니다. 첫 번째 행은 ~ 100k 행, 두 번째 행 ~ 300k 행 및 마지막 행 ~ 40 행이 있습니다. 첫 번째와 두 번째는 복합 조건에 의해 결합되어야하지만, 여기에 속임수가 있습니다. 쿼리를 실행하려면 OR 조건이어야합니다. OR 조건으로 인해 인덱스를 제대로 사용할 수 없습니다. 두 개의 어려운 테이블을 두 개의 분리 된 쿼리로 분리하고 이들을 유니온과 결합하여 mysql이 적절한 인덱스를 찾을 수 있도록 노력했습니다.또는

이 쿼리를 어떻게 최적화 할 수 있습니까?

select * from a, b, c where (a.x = b.x OR a.y = b.y) and b.z = c.z 
+2

첫 번째해야 할 일은 join 조건을 where 절 대신에 ON 조건으로 이동하는 것입니다. – cmd

+0

잘 모르겠습니다. 지금은 시도 할 수 없지만 분리 만하면 도움이되는지 확인해 보겠습니다. 2 개의 다른 변이? – Nanne

+0

Do not'SELECT * ' – Kermit

답변

0

이 쿼리의 UNION 시도 : -

select * 
from a 
INNER JOIN b ON a.x = b.x 
INNER JOIN c ON and b.z = c.z 
UNION 
select * 
from a 
INNER JOIN b ON a.y = b.y 
INNER JOIN c ON and b.z = c.z 

+0

이것과 비슷한 것을 시도했다. 나는 c를 남겨 둘 수 있도록 단순화하려고 시도했지만 성능은 여전히 ​​저조했다. – Masse

+0

이것은 OR이있을 때 MySQL이 인덱스를 사용할 수 있도록하는 일반적인 방법이다. 여전히 성능이 좋지 않은 경우 선택한 인덱스가 좋지 않을 수도 있습니다. EXPLAIN 또는이 쿼리의 버전을 게시 할 수 있습니까? – Kickstart

0

내가 ANSI 조인 구문을 사용하여 시작 했죠 (및 실제 응용 프로그램에서 나는 * SELECT 사용하지 않을 것에 동의합니다)

select * 
from a 
    inner join b on a.x = b.x OR a.y = b.y 
    inner join c on b.z = c.z 
+0

문제는 MySQL이 OR – Masse

+0

과 함께 복합 키를 사용할 수 없다는 것입니다.하지만 ax, ay, bx 및 각각에 별도의 인덱스가있는 경우 MySQL은 조인에 인덱스 병합을 사용할 수 있어야합니다. . 너 그거 해봤 니? –

+0

내가 그랬다고 생각해. 어느 시점에서 나는 모든 인덱스를 조합 할 수 있었지만 mysql은 인덱스를 선택하는 것을 매우 꺼려했습니다. – Masse

0

는이

같이 수행해야하고 쿼리를 최적화 할 수 EXPLAIN를 사용
select 
    [your column names] 
from a 
inner join b 
on a.x = b.x 
OR a.y = b.y 
inner join c 
on b.z = c.z