2010-03-16 7 views
0

에서 선택을 최적화 :MySQL을 - 나는 두 MySQL의 테이블, 상태 및 트랜스가 두 개의 연결된 테이블

:처럼 보이는

id (INT) - also the primary key 
energy (DOUBLE) 
[other stuff] 

트랜스 (14,000,000 개 항목) :

상태 (20 개 항목)처럼 보인다

i (INT) - a foreign key referencing states.id 
j (INT) - a foreign key referencing states.id 
A (DOUBLE) 

나는 trans.A> 30. (say)로 trans의 모든 항목을 검색 한 다음 일치하는 각 항목에서 참조하는 (고유 한) 상태에서 에너지 항목을 반환하고 싶습니다. 그래서 저는 두 개의 중간 테이블을 가지고이 작업을 수행합니다 :

CREATE TABLE ij SELECT i,j FROM trans WHERE A>30.; 
CREATE TABLE temp SELECT DISTINCT i FROM ij UNION SELECT DISTINCT j FROM ij; 
SELECT energy from states,temp WHERE id=temp.i; 

이것은 작동하는 것처럼 보이지만 중간 테이블 없이는 어떤 방법이 있습니까? 내가 트랜스에서 바로 하나의 명령으로 임시 테이블을 만들려고 할 때 :.이 두 배 큰 트랜스 테이블을 검색해야했기 때문에

CREATE TABLE temp SELECT DISTINCT i FROM trans WHERE A>30. UNION SELECT DISTINCT j FROM trans WHERE A>30.; 

그것은 '나는 내가 할 수있는 MySQL로 새로 온 사람과 아마도 (더 긴했다 t는 해당 문제를 발견하고 인터 웹에 거기에 대답하는 것. 많은 감사를 기독교

답변

0

이 트릭을해야한다, 나는, SQL 서버 2008에서 테스트했습니다 그래서 희망이 너무 MySQL의에서 작동합니다.

select energy from states 
where id in 
(
    select distinct i from trans where a > 30 
    union 
    select distinct j from trans where a > 30 
) 
+0

감사합니다 귀하의 회신, Axarydax,하지만 그게 내가 원하는 건 아니에요 : 내가 trans.i와 trans.j의 연합에서 고유 (고유 한 항목 각각의 목록을하고 싶습니다 trans.A> 30, 그리고 이 목록에있는 각 id는 state.energy 값을 원합니다. 당신의 방법으로, 나는 trans.j와 일치하는 ID만을 얻고, 그 목록 내에서 중복을 얻을 것이다. 도움을 주셔서 감사합니다. 기독교 – xnx

+0

업데이트 된 원본 텍스트 – Axarydax

+0

다시 한 번 감사드립니다. 한 줄로 어떻게 작동하는지 확인할 수 있습니다. 하지만 시도 할 때 명령을 실행하는 데 매우 오랜 시간이 걸립니다 (10 분 및 대기 중 ...). 반면 중간 테이블을 사용하면 10 초 이내에 완료됩니다. MySQL에서 명령을 최적화 할 수있는 방법이 있는지 알고 계십니까? – xnx

0

확인. .. Axarydax 다른 사람의 도움의 비트와 함께, 나는 (기본적으로 상당) 명령을 사용합니다 : 난에 충분히 빨리 내가 ​​인덱스를 가지고있는 경우에 작동

SELECT energy FROM states, 
(SELECT i FROM trans where A>30. UNION SELECT j i FROM trans WHERE A>30.) temp 
WHERE states.id=temp.i; 

을, J 및 A.