2014-10-23 2 views
1

FK를 추가 한 후 다음 add index 코드가 중복됩니까?MYSQL의 외래 키 인덱스

ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id); 
ALTER TABLE main ADD INDEX (language_id); 

왜 또는 왜 그렇지 않습니까?

+0

위의 답변은 위 질문에 제공된 답변보다 훨씬 강력합니다 (선택한 답변은 한 문장 길이입니다). 우리는이 질문을 답을 강하게해야한다고 생각합니다. – David542

+0

이 주제에 대한 이전 질문이 있습니다. http://stackoverflow.com/questions/304317/does-mysql-index-fore-key-columns-automatically 색인의 명시 적 정의를 사용하는 다른 방법은 다음과 같습니다. 색인 이름을 선택하십시오. 그렇지 않으면 MySql은 열 이름을 사용합니다. –

+0

아래의 여러 빠른 편집 작업에 대해 죄송합니다. 문서를 링크하는 동안 새로운 것을 배웠습니다. –

답변

2

예, 중복됩니다. FOREIGN KEY 제약 조건을 추가하면 암시 적으로 language_id에 색인이 생성됩니다. 다른 컬럼을 통합 한 다른 복합 인덱스를 추가해야하는 경우 중복되지는 않지만 단일 컬럼은 중복됩니다. 하나는 이미 FOREIGN KEY가 생성 될 때 존재하는 경우

ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id); 

-- This is redundant 
ALTER TABLE main ADD INDEX (language_id); 

-- This is not redundant 
ALTER TABLE main ADD INDEX (other_column, language_id); 

According to MySQL docs, MySQL은 FOREIGN KEY 열에 새로운 인덱스를 생성하지 않습니다.

MySQL은 외래 키 검사가 빠르며 테이블 스캔이 필요하지 않도록 외래 키와 참조 키에 인덱스가 필요합니다. 참조하는 테이블에는 외부 키 열이 같은 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다. 이러한 인덱스는 참조 테이블에 자동으로 작성됩니다 (존재하지 않는 경우). 외부 키 제한 조건을 적용하는 데 사용할 수있는 다른 색인을 작성하면이 색인은 나중에 자동으로 h 제됩니다. index_name이 주어지면 앞에서 설명한대로 사용됩니다. 이미 새로운 인덱스를 만들 필요가 없습니다 것 FOREIGN KEY 제약 조건을 생성, 컬럼에이 인덱스가 있다면 인덱스 열, 왼쪽에서 오른쪽으로 사용된다 그래서 때문에

.

-- Already has a composite index with the FK column listed first 
ALTER TABLE main ADD INDEX (language_id, other_column); 
-- This won't create a new index when the constraint is defined 
ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id); 

편집 : 위의 단락이 메모에 따르면 : 당신이 외래 키를 적용하는 데 사용할 수있는 또 다른 인덱스를 만들 경우

이 인덱스는 자동으로 나중에 삭제 될 수 있습니다 제약

... 제안 된 중복 색인을 만든 경우 MySQL은 명시 적으로 생성 된 인덱스가 대신 사용될 수 있으므로 FORIEGN KEY 제약 조건의 일부로 암시 적으로 생성 한 인덱스를 삭제하십시오. 따라서 두 지표를 계속 유지하지 못할 수도 있습니다.

마찬가지로 위의 복합 색인을 추가하면 더 이상 FK의 암시 적으로 생성 된 색인을 유지 관리 할 필요가 없습니다.

ALTER TABLE main ADD FOREIGN KEY (language_id) REFERENCES main_language (id); 
-- Adding this later may allow MySQL to drop the implicit index created with the FK 
ALTER TABLE main ADD INDEX (language_id, other_column);