2012-01-17 4 views
2

기본 쿼리로 인덱스를 올바르게 사용하는 방법을 이해하려고합니다.간단한 선택 쿼리로 인덱스 이해

예 : 나는 다음과 같은 열이있는 테이블 'testme라는'가

:

id int primary key 
username varchar(20) 
data1 int 
data2 int 
data3 int 
data_order int 

select username,data1,data2 from testme where data3=5 order by data_order; 

인덱스의 종류 내가 속도를 사용할 수 있습니다 난 경우를 쿼리?

나는 clums data3 및 data_order에 색인을 추가하려고 시도했지만 그 쿼리에 '설명'한 결과는 해당 색인을 사용하지 않는다는 것을 보여줍니다.

업데이트 : -

색인 데이터 3 (해시에 당신이 데이터 3 만 쿼리 존재하는 것이 확실한 경우이 특정 쿼리에 대한 MySQL 클러스터 (NDB)

+0

테이블의 크기는 어느 정도입니까? MySQL에 대해서는 잘 모르겠지만 많은 RDBMS에서 인덱스보다는 테이블 스캔에 의해 상대적으로 작은 테이블 (일반적으로 약 100,000 개 미만의 행)에 액세스하는 것이 더 빠릅니다. –

+0

이 테이블은 실제로는 작지만이 쿼리는 저속 쿼리 로그에 나타납니다. – ufk

+0

'(데이터 3, 데이터 _ 순서) '에 대한 BTREE 인덱스는 @Dems가 제안해야하는 것처럼 좋습니다. – newtover

답변

2

를 사용 도움이 될 것입니다 두 개의 인덱스가 있습니다 그렇지 않으면 btree를 사용합니다.)

EDIT : AFAIK mysql이 where 및 order 문에 대한 복합 인덱스를 항상 검색하지는 않으며, 다른 문제가 나중에 발생하므로 나중에 별도의 인덱스가 더 좋습니다. 이 색인을 사용하는 주문 만 사용할 수 없습니다 (색인 의지 데이터 3 + data_order이 될 않거나 데이터 3를위한 MySQL은 가장 왼쪽 열에서 인덱스를) 읽을

+0

두 열에 대해 하나의 인덱스를 갖는 것에 대해 어떻게 생각합니까? –

+0

다른 필드를 포함하는 복합 인덱스가있을 때 인덱스가 사용되지 않는다는 것을 의미합니까? – SergeS

+0

정말 그렇습니다. –

1

경우에 가장 적합한 인덱스 (실제로는 테이블 크기와 date3의 카디널리티)에 따라 달라집니다

CREATE INDEX yourindex ON yourtable(Data3, Data_order) 
INCLUDE(username, data1, data2) 

또는 MySQL이없는 경우 열 포함 지원 안 함

CREATE INDEX yourindex ON yourtable(Data3, Data_order, username, data1, data2) 

왜 최상입니까?

  • 주문 data_order
  • 에 의해 직접 date3 값에 의해

    • 필터를 사용하면 선택 목록에 필요한 모든 (커버 인덱스)를 포함한다 (MySQL은 열을 포함하여 지원하는 경우)

    업데이트 :

    작은 테이블의 경우 optimi zer는 인덱스 대신 테이블 스캔을 사용하도록 선택할 수 있습니다. 테이블에

    더 많은 데이터는 * 확률이 더 높다 인덱스는 인덱스의 카디 두 가지 ...
    1로 인덱스의

  • +0

    예제에서 INCLUDE는 무엇인가? MySQL에서 지원하지 않는 것 같습니다 : http://dev.mysql.com/doc/refman/5.1/en/create-index.html – newtover

    +0

    인덱스 정의에서'ASC'는 사람들이'DESC'가 말이되다. 유감스럽게도 아직 MySQL에서는 그렇지 않습니다. – newtover

    +0

    이것은 단지 오류를 제공하기 때문에 구문에 create index 명령에 포함 매개 변수가 있음이 표시되지 않습니다. – ufk

    2

    생각해 충분히 높은 특히, 사용됩니다. 데이터가 저장된 순서
    2.특정 데이터 (예 : 서적 색인)를 빠르게 검색하는 방법

    예를 들어, 색인을 (data3, data_order)에두면 원하는 데이터를 쉽게 찾고 올바른 순서로 가져올 수 있습니다.

    인덱스를 검색 한 후에도 테이블로 이동해야 필드 을 가져와야합니다. 이런 이유로 색인에있는 include 수 있습니다. 이렇게하면 더 많은 공간과 약간의 노력을 사용하여 색인을 더 크게 만들 수 있습니다. 그러나이 비용은 인덱스가 이 아니며 테이블에이 합쳐 졌음을 의미합니다. 그것은 단지 색인을 읽는 것입니다.