2017-01-16 10 views
1

외래 키를 추가 한 후 mysql은 여러 인덱스 메소드로 이전에 인덱싱 된 키를 인덱스하도록 강제했습니다. 나는 InnoDB를 사용한다. 여기 인덱싱 된 필드가 외래 키인 경우 여러 인덱스 메서드를 사용해야합니까?

내 테이블의 구조 :

id, company_id, student_id ...

company_idstudent_id

사용 인덱스했다 :

ALTER TABLE `table` ADD INDEX `multiple_index` (`company_id`,`student_id`) 

는 왜 여러 인덱스 컬럼을 사용할 수 있습니까? 때문에 가장 많은 시간 내 쿼리는 다음과 같습니다

SELECT * FROM `table` WHERE company_id = 1 AND student_id = 3 

은 언젠가 난 그냥 student_id에 의해 열을 가져 오기 :

SELECT * FROM `table` WHERE student_id = 3 

company_idstudent_id MySQL을위한 외래 키를 추가 한 후 별도로 둘 다 인덱스. 이제 여러 개의 인덱스 필드가 별도로 있습니다.

제 질문은 여러 색인 된 키를 삭제해야합니까?

답변

1

에 따라 다릅니다. 동일한 학생이 많은 회사에 속한다면, 아닙니다. company_id = 1 AND student_id = 3을 쿼리 할 때 옵티마이 저는 하나의 인덱스를 선택해야하며 이후에는 여러 학생이나 여러 회사를 확인해야합니다.

내 직감은 이것이 사실이 아닐 것이라고 말합니다. 학생들은 ~ 10 개 이상의 회사와 관련이 없으므로 색인을 통해 조금만 스캔하면 큰 문제가되지 않습니다. 즉,이 두 열에 인덱스를 갖는 것보다 훨씬 더 취약합니다. 이 경우 옵티마이 저는 올바른 일이 무엇인지 알고 있습니다. 선택할 인덱스가 두 개인 경우에는 그렇지 않을 수도 있고 앞으로는 그렇지 않을 수도 있으므로 FORCE INDEX에서 student_id 인덱스를 사용하도록해야합니다.

고려해야 할 다른 사항은이 표가 사용되는 방법입니다. 자주 쓰지는 않지만 자주 읽지 않는다면 여분의 색인을위한 공간 이상의 처벌은별로 없습니다.

TL; DR : 색인이 중복되지 않습니다. 그것을 지켜야하는지 여부는 복잡합니다.

+0

알 수 있습니다. 큰 데이터이기 때문에 여러 인덱스를 사용했습니다. 여러 색인을 사용하면 학생의 정보를 더 빨리 가져올 수 있다고 생각했습니다. – Rashad