2011-09-19 8 views
1

10 개의 테이블에서 데이터를 선택하기 위해 요청을 사용 중이고 어디에서나 WHERE 및 2 개의 조건이 있습니다 첫 번째 것은 간단하지만 두 번째는 빠르면 속도가 현저히 떨어집니다 결과가 반환되지 않았습니다. 내가 그것을 제거하면WHERE 필터로 인해 여러 테이블에서 MySQL 요청이 느려짐

AND (eligible_users.id IS NULL OR 
((eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35)) 

, 페이지가로드가 훨씬 빨리, 더 빨리 만들하지만 여전히 내가 그것을 필요로하기 때문에이 필터를해야 할 몇 가지 방법이있다.

+2

쿼리에 EXPLAIN을 실행 했습니까? 그것은 무엇을 말하는가? – jasonbar

+0

아마도 "상태"열에 색인이 필요합니다. 다음과 같이 추가 할 수 있습니다 :'CREATE INDEX status_index ON eligible_users (status); ' –

+1

또한 @jasonbar가 말한 것에서 두 번째로. EXPLAIN의 결과는 쿼리가 어떻게 평가되는지를 설명 할 것입니다. 그리고 어디서나 색인이 누락 되었다면 알려줄 것입니다. –

답변

0

당신은 쿼리의 3 문을, 그래서 같이 1 개 이상의 노조로 분할 시도 :

select ... 
where ... 
eligible_users.id IS NULL 
UNION 
select ... 
where ... 
(eligible_users.program = 3 AND eligible_users.status = 0) 
OR eligible_users.status = 35 
+0

그럼 하나의 쿼리처럼 작동하지 않는 주문을 사용할 수 없습니다 – JohnU43

+0

@ JohnU43 예 : 'select * from (선택 ... 조합 선택 ...) t order by t.your_column' – Icarus

0

두 개의 인덱스, 프로그램의 하나는 아마 잘 일을 속도 것입니다 상태를 하나 추가.

+0

요청에서 사용되지 않더라도 테이블 자체에서 색인을 생성합니다. – JohnU43

+0

@ JohnU43 예, 특정 필드에 대해 테이블의 색인입니다. 인덱스는 데이터베이스가 where 절을 더 빨리 평가하는 데 도움이됩니다. –

관련 문제