2013-07-06 2 views
0

것은 내가 where 절에서 다음과 같은 경우 어디에서 인덱스를 사용하지 :

(approps_precio * moneda_valor BETWEEN 2000 AND 6000) 

IT는 idx_approps_precio 인덱스를 사용하지 않습니다.

(approps_precio BETWEEN 2000 AND 6000) 

그러나

아주 잘한다.

* 작업을 추가하고 색인을 계속 사용하는 방법이 있습니까?

미리 감사드립니다.

+0

'approps_precio * moneda_valor' 제품을 자신의 (n 개의 인덱스가 지정된) 열에 저장하는 것이 고려 되었습니까? [triggers] (http://dev.mysql.com/doc/en/triggers.html)를 사용하여 그 값이 기본 열과 일치하도록 할 수 있습니다. – eggyal

답변

0

* 연산은 값을 0으로 만들고 따라서 moneda_valor가 null 일 때 범위 밖의 값을 만듭니다.

approps_precio BETWEEN 2000 AND 6000 and moneda_valor IS NOT NULL

1

moneda_valor 상수 : 그래서 당신은 그것을 다시 할 수 있습니까? 그렇지 않은 경우, approps_precio에 moneda_valor를 곱한 값을 찾을 때 approps_precio의 색인은 쓸모가 없습니다.

+0

은 상수가 아니며 이전 조인에 의해 검색된 값입니다. – KillDash9

1

내가 지원하는 일부 공식 문서를 찾기 위해 주위를 파고 한 것을 폴 뒤부아 (MySQL의 문서 팀의 일원이기는하지만) 그의 책 MySQL (Developer's Library)의 다섯 번째 장 "쿼리 최적화"에서 말한다 :

인덱스 된 열을 비교 식으로 사용하십시오. 함수 호출에서 열을 사용하거나 산술 표현식에서 좀 더 복잡한 용어의 일부로 사용하는 경우 MySQL은 모든 행에 대해 표현식 값을 계산해야하므로 인덱스를 사용할 수 없습니다. 경우에 따라서는 피할 수없는 경우가 있지만 인덱스 된 열을 표시하기 위해 쿼리를 다시 작성할 수있는 경우가 많습니다.

그러나, MySQL은 연산이 존재하는 트랜스 포지션을 지원하지 않습니다

내가 찾을 수있는 최선은 내부 설명서에 Optimizer Transpositions에 관한 부분이다. 따라서 :

WHERE 5 = -column1 

같이 동일하게 취급되지 않는다 : 폼 열의 표현식

WHERE column1 = -5 

트랜스 포지션 = 정수 인덱스 룩업 이상적이다. 이 경우

, 하나 moneda_valor 의해 관통 나누어 필터 조건을 재 기입함으로써 approps_precio에 인덱스를 이용할 수

WHERE approps_precio BETWEEN 2000/moneda_valor AND 6000/moneda_valor 

참고 MySQL이 아직 각각의 레코드에 대한 분할을 평가할 필요가 있다는 그래서 나는 많은 것이 구원받을 것이라고 확신하지 않는다.