2011-03-22 3 views
0

나는 다음과 같은 테이블이 : 나는 쿼리를더 많은 열을 쿼리 할 때 MYSQL이 동일한 쿼리에 인덱스를 사용하지 않는 이유는 무엇입니까?

select id from stuff order by id; 

을 EXPLAIN 경우

create table stuff (
     id mediumint unsigned not null auto_increment primary key, 
     title varchar(150) not null, 
     link varchar(250) not null, 
     time timestamp default current_timestamp not null, 
     content varchar(1500) 
); 

을 다음은 결과를 주문하는 지표로 그들에게 차 키를 사용하여 말한다. 하지만이 쿼리 :

select id,title from stuff order by id; 

가 EXPLAIN 더 가능한 키 말한다 그것은 filesort에 의지한다.

왜 그럴까요? 특정 행의 데이터가 데이터베이스에 함께 저장되어 있지 않습니까? ID 만 쿼리 할 때 인덱스를 사용하여 결과를 정렬 할 수 있다면 다른 열을 쿼리에 추가하면 왜 차이가 발생합니까? 기본 키는 이미 행을 식별하므로 두 번째 경우에도 순서 지정에 기본 키를 사용해야한다고 생각합니다.

왜 이것이 사실이 아닌지 설명 할 수 있습니까?

+0

답변에 대한 확신이 없지만 작동 방식은 다음과 같습니다. http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – DhruvPathak

+0

해당 사례 없음 색인을 사용할 수없는 목록은 여기에 적용되는 것 같습니다. – Tom

+0

다이빙을하지 않고 이러한 것들에 대해 더 자세히 알고 싶다면 개발자를위한 [SQL 인덱싱 자습서 (MySQL 포함)] (http://use-the-index-luke.com/)에 관심이있을 수 있습니다. 귀하의 특별한 질문은 첫 장 - [색인의 구조] (http://use-the-index-luke.com/de/sql/anatomy)에서 답변을 얻을 수 있습니다. –

답변

2

확실히이 쿼리에서 성능이 우수하기 때문에 전체 인덱스를 읽은 다음 데이터에서 행별로 반복적으로 읽어야합니다. 이것은 매우 불충분합니다. 이 대신 mysql은 데이터 파일에서 데이터를 바로 읽는 것을 선호합니다.

또한 어떤 종류의 스토리지 엔진을 사용합니까? mysam처럼 보입니다.

이 경우 innodb는 기본 키보다 클러스터 색인을 사용하기 때문에 (이 경우에는 단조롭게 증가합니다).

+0

그래,하지만 데이터 파일에서 데이터를 검색 한 후 인덱스를 사용하여 순서대로 행을 반환하지 않는 이유는 무엇입니까? 데이터를 메모리로 읽어 들인 다음 인덱스를 사용하여 반복적으로 행을 반환하십시오. 이미 정렬 된 색인 파일을 사용하면 모든 행을 파일로 정렬하는 것보다 빠르지 않습니까? – Tom

+0

@Tom : 만약 그렇다면 - mysql이 그렇게 할 것이다 ;-) 그렇게하지 않기 때문에 - 더 빠르지 않다. 얼마나 많은 행이 있습니까? <10k 정도의 파일 목록을 사용하는 정렬은 매우 빠르게 수행됩니다. 그리고 그러한 종류의 질의에 대한 색인은 쓸모가 없다. – zerkms

+0

큰 테이블이 아니기 때문에 아직 성능 문제는 아닙니다. 테이블이 100k 행 이상 증가하면 mysql이 인덱스 파일을 사용할 것이라고 말합니까? 설명의 결과는 표의 크기에 달려 있습니까? – Tom

관련 문제