2009-10-29 2 views
3

나는MySQL은 여러 인덱스 질문

id INT AUTOINVREMENT PRIMARY 
uid INT index 
email CHAR(128) UNIQUE 
activated TINYINT 

로 열이있는 테이블 (사용자)가 그리고이 같은이 테이블 쿼리해야합니다 :이 이후,

SELECT * FROM users WHERE uid = ? AND activated = 1 

내 질문입니다 위의 쿼리에 대해 최상의 성능을 얻으려면 'uid'열에 인덱스를 설정해야합니다. '활성화 된'열에도 다른 인덱스를 설정해야합니까? 이 테이블 (큰 테이블)은 'INSERT', 'UPDATE'문과 'SELECT'문으로 크게 액세스됩니다.

다른 소스에서 '인덱스'가 'INSERT'및 'UPDATE'문과 반대되는 것을 배웠으므로 위의 쿼리에 대해 uid 열의 인덱스로 충분하면 다른 인덱스를 설정할 필요가 없습니다. 활성화 '에 대해 & 업데이트 성능을 삽입하십시오.

답변

4

MySQL은 어쨌든 테이블 당 인덱스를 1 개만 사용하므로 추가 인덱스가 있으면 도움이되지 않습니다. 당신이 정말로 최적의 성능을 원하는 경우

그러나,이 순서대로 두 컬럼에 인덱스를 정의 : 단지 uid, 또는 uid AND activated의 조회를 최적화 수 있습니다. (2 열에서 예를 들어 1 개 인덱스)

index_name (uid, activated) 

.

+0

필자는 두 열을 모두 인덱싱하는 것이 더 좋을 경우가 아니라면 많은 삽입 또는 업데이트를 가져 오는 열의 인덱스를 사용하는 것이 성능에 미치는 영향에 대해 더 많이 알고 있다고 생각합니다. – catfarm

+0

하나의 인덱스를 2 개의 열 (uid, activated)로 설정하거나 두 개의 인덱스를 하나의 uid에 대해 설정하고 하나를 활성화로 설정 하시겠습니까? – Shawn

+0

@Shawn. 네, 늦게 고쳤습니다, 죄송합니다, 고마워요! – gahooa

0

이것은 데이터 배포 및 uid의 선택성 대 uid의 선택성 및 활성화 여부에 따라 다릅니다. uid에 고유 한 값이 많으면 높은 선택도를 갖습니다. 즉, uid = x를 검색하면 인덱스에 활성화 된 값을 포함하여 몇 개의 행만 반환됩니다. uid = x가 많은 행을 반환하고 uid = x 및 activated = 1이 몇 개의 행을 반환하면 인덱스에 값이 있습니다.

데이터 배포를 모른 채 구체적인 답변을 제공하기는 어렵습니다.

0

색인을 만들면 더 느리게 선택하지 않습니다.

그러나 에 대한 검색이 이벤트와 다른 경우에만 검색 속도가 훨씬 빨라집니다.

계정의 대부분이 활성화되지 사람, 또는 그와 반대로 을 활성화하고 를 검색하는 경우이 인덱스는 도움이 될 것입니다 : 계정의 대부분은 비 활성화 당신입니다을 활성화 것들을 검색하십시오.

이 인덱스는 UPDATEDELETE 동시성을 향상 만들기 :이 인덱스없이, 주어진 uid에 대한 모든 계정 (모두 활성화 및 활성화되지 않음) InnoDB에서 UPDATE 작업을 수행하는 동안 잠 깁니다.

그러나 추가 색인은 당연히 DML 성능을 저해 할 것입니다.