2011-12-22 2 views
5

나는 SELECT 성명을 가지고 있는데 그것을 최적화하고 싶습니다. mysql - order by optimization은 경우에 따라 ORDER BY을 최적화하기 위해 색인을 사용할 수 없다고 말합니다. 특히 점 : 당신은 key_part2에 의해 T1 키 2 = 일정 ORDER에서 키
SELECT *의 비 연속적인 부분에 ORDER BY를 사용ORDER BY 최적화가 다음 SELECT 문에서 적용됩니까?

;

이 경우가 될 수 있습니다. 다음 SQL 문으로

UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`), 
KEY `met_value_index` (`DATETIME`,`RTU_NB`) 

: 나는 다음과 같은 인덱스를 사용하고

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY mp_nb, datetime 
  • 이 충분히 인덱스 met_value_index1을 삭제하고 새가 RTU_NB, MP_NB, DATETIME 주문 그것을 만들 것입니까?
  • ORDER BY 절에 RTU_NB를 포함해야합니까?


결과 : 나는 시도 무엇 @meriton 제안 및 인덱스 met_value_index2을 추가했습니다. SELECT은 1.2 초 후에 완료되었지만 이전에는 5.06 초 후에 완료되었습니다. 다음은 질문에 속하지 않지만 부수적 인 참고 사항입니다. 다른 시도를 한 후에 엔진을 MyISAM에서 InnoDB로 전환했습니다 - rtu_nb, mp_nb, datetime을 기본 키로 사용하여 - 진술은 0.13 초 후에 완료되었습니다!

답변

1

검색어가 없습니다. 행이 mp_np = constant과 일치해야 반환되는 모든 반환 된 행은 동일한 mp_nb이므로 order by 절에 mp_nb을 포함하면 아무 효과가 없습니다. 난 당신이 의미 동등 문을 사용하는 것이 좋습니다 :

SELECT * FROM met_value 
WHERE rtu_nb=constant 
AND mp_nb=constant 
AND datetime BETWEEN constant AND constant 
ORDER BY datetime 

가 불필요하게 쿼리 최적화 혼란을 방지하기 위해.

이제 질문에 : 데이터베이스는 기본 액세스가 올바른 순서로 행을 반환한다는 것을 알고 있으면 정렬없이 order by 절을 구현할 수 있습니다. 인덱스의 경우, where 절로 일치하는 행이 order by 절에 의해 요청 된 순서대로 인덱스에 나타나는 경우 인덱스가 정렬을 지원할 수 있음을 의미합니다.

데이터베이스 행 rtu_nb=constant AND datetime BETWEEN constant AND constant에 대한 met_value_index1을 통해 인덱스 범위 스캔을 사실 수 있도록, 여기에 케이스이며, 다음 각 행에 대한 mp_nb=constant 여부를 확인하지만이 필요한 것보다 훨씬 더 많은 행을 확인에 달할 것

mp_nb=constant이 높은 선택성을 갖는다면.달리 말하면 일치하는 행이 인덱스에서 연속적이면 인덱스가 가장 유용합니다. 인덱스 범위 스캔은 실제로 반환해야하는 행만 터치하기 때문입니다. 바로 옆에 서로 인덱스에있을 것입니다 일치하는 모든 행으로

UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`), 

을하고 행이를 주문 order by 절에서 인덱스에 나타납니다

다음 인덱스 그러므로이 쿼리에 대한 더 많은 도움이 될 것입니다 요청. 쿼리 최적화 프로그램이 충분히 똑똑하다는 것을 말할 수 없으므로 실행 계획을 확인해야합니다.

+0

설명과 제안에 감사드립니다. 나는 그것을 시도하고 가능한 한 빨리 결과를보고 할 것이다 - 현재 원격 기계의 전원이 꺼져있다. 그리고 나는 무엇이 바뀔지 궁금하다. –

0

WHERE 절에 나타나는 필드의 순서는 색인의 순서와 일치해야합니다. 따라서 현재 쿼리를 사용하면 rtu_nb, mp_nb, datetime 순서로 필드가있는 인덱스가 하나 필요합니다.

+0

[이것은 사실이 아닙니다.] (http://stackoverflow.com/questions/3805863/order-of-ands-in-where-clause-for-greatest-performance) 또한 질문과 관련이 없습니다. –

+0

MySQL에서는 절대적으로 사실입니다. innodb 엔진 인덱스의 경우 특히 그렇습니다. 이 문제에 대해서는 meritons answer 또는 Zawodnys 교과서를 읽으십시오. – Anony

1

ORDER BY에 대한 색인을 사용하지 않을 것이라고 생각합니다. 그러나 execution plan을 봐야합니다. 또는 here.