2009-12-29 4 views
0

저는 MySQL 5.0을 사용 중이며 인덱스에 약간 새로운 기능이 있습니다. 다음 중 인덱싱을 통해 도움을받을 수있는 쿼리와 생성해야하는 인덱스는 무엇입니까?mysql : 어떤 쿼리가 어떤 인덱스를 종결시킬 수 있습니까?

이 (고유 한 값을 가지고 테이블 중 하나를 가정하지 마십시오.이는 단지 몇 가지 예 내가 시도하고 인덱싱 주위에 내 머리를 얻기 위해 만든, 숙제를하지 않습니다.) 여기

Query1: 
Select a.*, b.* 
From a 
Left Join b on b.type=a.type; 

Query2: 
Select a.*, b.* 
From a,b 
Where a.type=b.type; 

Query3: 
Select a.* 
From a 
Where a.type in (Select b.type from b where b.brand=5); 

은 내 생각이다 무엇을 인덱스는 쿼리의 서로 다른 종류의 사용 될 것이다 :

Query1: 
Create Index Query1 Using Hash on b (type); 

Query2: 
Create Index Query2a Using Hash on a (type); 
Create Index Query2b Using Hash on b (type); 

Query3: 
Create Index Query2a Using Hash on b (brand,type); 

내가 Query1을 또는 QUERY3도이 테이블에 어떤 인덱스를 활용하는 것이 올바른 있습니까?

나는 단지 = 또는! =, 맞기 때문에 이것들이 모두 해시되어야한다고 생각합니다.

감사

답변

1

mysql에서 explain 명령을 사용하면 mysql이 수행하는 작업과 쿼리를 최적화하는 방법에 대한 많은 훌륭한 정보를 얻을 수 있습니다.

q1 및 q2 : q3의 : a.b_type에 대한 색인, 다른 모든 a (a.type 및 기타 모든 col)에 대한 색인 cols) 및 하나의 b (브랜드, 유형)

이상적으로, mysql이 인덱스에서 테이블 데이터로 다시 이동할 필요가 없도록 인덱스에 직접 저장되어있는 것이 가장 이상적입니다. 선택된 열을 가져옵니다. 그러나 항상 관리 할 수있는 것은 아닙니다 (예 : *를 선택하고 모든 열을 색인하는 데 너무 비용이 많이 드는 경우가 있습니다).이 경우 검색 열만 색인하는 것이 좋습니다.

당신이 말하는 모든 것이 훌륭합니다. 브랜드 = 5와 B의의의 수들이 (분류되어 이에 따른) B-나무 경우 QUERY2이 인덱스를 이용할 것이다 제로

에 가까운 경우

+0

와우 ... 네, mysql 문서는 조인되지 않은 열을 인덱싱하는 것에 대해 언급하지 않았습니다. 팁 고마워! – Dan

+0

더 나은 접근 방법은 클러스터 된 인덱스를 사용하는 것입니다. 물론 항상 가능하지는 않습니다. –

+0

클러스터 된 예 좋습니다. mysql에서 최소한 고유 한 컬럼에만있을 수있다. ms SQL 서버가 확실히 더 나은 지원을합니다. – jspcal

1

쿼리 3가 유효하지 않은,하지만 난 당신이

where a.type in ....

검색어 1 쿼리 두 단지 더 나은 구문과 동일한 의미 가정 모두 아마 같은 쿼리 계획 모두가 두 인덱스를 모두 사용합니다.

쿼리 3은 인덱스를 b.brand에 사용하지만 형식 부분은 사용하지 않습니다. 또한 a.type에 색인이있는 경우 색인을 사용합니다.

해시 인덱스가 맞아야합니다.

+0

필자의 오타가 수정되었습니다. – Dan

+0

죄송합니다. 쿼리 1은 외부 조인이므로 'a'의 모든 값을 출력합니다 (쿼리 2는 지원하지 않습니다). – Dmitry

1

쿼리 3 a.type에 인덱스를 활용할 수 있습니다. 인덱스 조인에 해시 인덱스를 사용하면 쿼리의 속도가 느려질 수 있습니다 (비 순차적 방식으로 크기 (a) 값을 읽어야하기 때문에)

1

쿼리 최적화 및 인덱싱은 매우 중요한 토픽입니다. MySQL 및 사용중인 특정 스토리지 엔진에 대해 읽어보십시오. "using hash"는 InnoDB와 NDB에서 지원됩니다; 나는 MyISAM이 그것을 지원한다고 생각하지 않는다.

조인 조건이 같음에도 조인을 수행하면 전체 테이블 또는 인덱스 스캔이 수행됩니다. where 절이 없으므로 모든 행을 읽어야합니다.

아마도 표준 b- 트리 색인으로 더 나을 것이지만이를 측정하고 "설명"을 사용하여 쿼리 계획을 조사하십시오. MySQL InnoDB는 기본 키로 구성된 행 데이터를 저장하므로 색인뿐만 아니라 테이블에도 기본 키가 있어야합니다. 그렇지 않으면 MySQL이 인덱스에서 기본 키를 검색하고 행을 가져 오기 위해 다른 페치를 수행하기 때문에 조인에서 기본 키를 사용할 수있는 것이 가장 좋습니다. 이 규칙의 예외는 보조 색인에 검색어에 필요한 모든 열이 포함되어있는 경우입니다. 그것은 커버 링 인덱스 (covering index)라고 불리며, MySQL은 행을 전혀 검색 할 필요가 없습니다.

+0

http://dev.mysql.com/doc/refman/5.0/en/create-index.html에서 색인 유형을 찾았습니다. MyISAM은 해시 인덱스를 지원하지 않습니다. 나는 InnoDB에 관해서 틀렸다. 해시 인덱스도 지원하지 않는다. 그것은 b-tree 인덱스로부터 만들어진 적응 형 해싱 시스템을 가지고 있습니다. –

관련 문제