2012-02-06 5 views
0

내가 그 인덱스 "에 의해 순서"돌볼 것인가 (이름, created_at) 및 IMySQL 인덱스가 자동으로 ORDER BY 계정을 사용합니까?

SELECT * WHERE name='blah' and created_at="blah" ORDER BY created_at DESC 

에 인덱스를 작성하는 경우?

그렇지 않은 경우 색인을 작성하면 ORDER BY가 더 효율적입니다.

+0

"인덱스가 순서에 따라 처리하겠습니까?" –

답변

0

가능한 경우 색인은 순서에 사용됩니다. 그러나 예제에서는 모든 결과가 created_at에 대해 "blah"값을 가지므로 주문할 것이 없습니다. 다음과 같은 의미였습니까? 위의 경우

SELECT * WHERE name='blah' ORDER BY created_at DESC 

는 화합물 "피복"인덱스 (이름, created_at)는 WHERE 선택 및 정렬 모두에 대해 사용된다.

기본 색인 유형은 btree이며 트리의 맨 위에는 name의 모든 값이 정렬됩니다. 각 이름 분기 아래에 각각 created_at이 주문됩니다.

그래서 MySQL은 인덱스 부분을 사용하여 name이 'blah'와 같은 인덱스 섹션을 찾은 다음 나머지 브랜치를 사용하여 created_at 결과의 기본 키를 반환합니다 색인으로 주문하십시오.

레코드가 이미 순서대로 반환되므로 더 정렬 할 필요가 없습니다.

+0

예를 들어, 복합 인덱스 (name, created_at)를 만들어야합니다. 맞습니까? 색인 이름 만 지정하면 쿼리가 정렬에 최적화되지 않습니다. 코렉? – user847495

+0

이것은 다소 MySQL의 버전에 달려 있습니다. 최신 버전의 MySQL은 순서에 대해 별도의 색인을 사용할 수 있습니다. 그러나 (name, created_at)가있는 복합 색인이있는 경우 모든 경우에 사용할 수 있습니다. –

0

BTREE 인덱스 (기본값)를 사용하여 정렬 할 수 있습니다. 인덱스가 사용될 경우 옵티마이 저가 알아내는 것에 달려 있습니다.

쿼리 앞에 EXPLAIN을 사용하여 확인할 수 있습니다.

이 쿼리의 경우 ORDER BY는 특정 created_at을 검색 할 때 많은 영향을 미치지 않습니다. 쿼리는 더이 같은

인 경우 :

SELECT * FROM foo WHERE name='blah' ORDER BY created_at DESC 

또는

SELECT * FROM foo WHERE name='blah' and created_at BETWEEN 'a' AND 'z' ORDER BY created_at DESC 

당신은 (순서대로) 이름과 created_at 모두에서 단일 인덱스를 사용하여 더 나은 결과를 얻을 것입니다. 먼저 색인을 사용하여 이름을 일치시킨 다음 동일한 색인을 사용하여 결과를 정렬합니다.

ALTER TABLE foo ADD INDEX (`name`, `created_at`) 

물론 이것은 여전히 ​​EXPLAIN으로 확인되어야합니다. 데이터베이스 최적화 프로그램은 정확한 쿼리 값과 예상되는 데이터의 양에 따라 최선이라고 생각하는 것을 수행합니다.