2014-11-05 2 views
0

그냥 상상 우리를 보자 여러 열에서 다른 테이블에서 ID를 선택합니다 내가 가지고있는 테이블 구조 다음개선 성능은

테이블 : 이미지

id path 

1 x 
2 x 
3 x 
4 x 
5 x 
6 x 
7 x 
8 x 

테이블 : 사용자

id image imageSmall 

1  1  1 
2  2  2 
3  4  4 

표 : 서적

id image imageSmall 

1  5  5 
2  6  6 
3  8  8 

이제 다른 테이블에서 사용되는 모든 이미지의 ID를 가져 오려고합니다. 나는 많은 양의 데이터를 때,이 쿼리는 매우 많은 시간이 소요 전혀 때문에의 많은 IN 부품하지 확대됨에 될 수 있다고 여기

SELECT id FROM images WHERE id IN (SELECT image FROM user) OR id IN (SELECT imageSmall FROM user) OR id IN (SELECT image FROM books) OR id IN (SELECT imageSmall FROM books); 

내가 여기에서 볼 문제이 쿼리를 만든 질문. 이 쿼리의 성능을 향상시킬 수있는 방법이 있습니까?

+0

'SELECT DISTINCT id FROM images from WHERE id IN (SELECT image from 사용자 UNION SELECT imageSmall FROM 사용자 UNION SELECT image FROM books UNION SELECT imageSmall FROM books); – vaso123

+0

모든 subselect는 JOIN으로 재 작성 될 수 있습니다. . 그러나 MySQL 옵티마이 저는 수행해야 할 작업에 대해 현명 할만큼 좋습니다. 즉, 상상했던 시나리오가 있는지 여부를 확인해야합니다. 많은 레코드를 작성한 후 조회 성능을 측정하십시오. MySQL이 무엇을하는지 그리고 정말로 시간을 소비 하는지를 보려면'EXPLAIN'을 사용하십시오 - 그러면 최적화 할 시간입니다. –

답변

2

나는이 exists보다는 in를 문구를 사용하는 것입니다 : 성능

SELECT id 
FROM images i 
WHERE EXISTS (SELECT 1 FROM user u WHERE u.image = i.id) OR 
     EXiSTS (SELECT 1 FROM user u WHERE u.imageSmall = i.id) OR 
     EXISTS (SELECT 1 FROM books b WHERE b.image = i.id); 

, 당신은 다음과 같은 인덱스가 있는지 확인 :

create index idx_user_image on user(image); 
create index idx_user_imageSmall on user(imageSmall); 
create index idx_books_image on books(image); 
0

사용하는 대신 많은 선택에서 선택한 그 조인을, DISTINCT를 사용하여 고유 값을 반환하십시오.

SELECT DISTINCT(i.id) FROM images i 
INNER JOIN `user` u 
INNER JOIN `books` b 
WHERE b.image=i.id OR b.imageSmall=i.id OR u.image=i.id OR u.imageSmall=i.id