이들은 (거의 *) 동일합니다.
외래 키 제약 조건을 만들면 적합한 색인이 이미없는 경우 색인이 참조 테이블의 관련 열에 자동으로 만들어집니다. 매뉴얼 페이지에서
FOREIGN KEY Constraints에 : 외래 키 검사가 신속하고 테이블 스캔을 필요로하지 수 있도록
InnoDB하지만 외래 키와 참조 키에 대한 인덱스를 필요로한다. 참조하는 테이블에는 외부 키 열이 같은 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다. 이러한 인덱스는 참조 테이블에없는 경우 자동으로 작성됩니다. 외래 키 제약 조건을 적용하는 데 사용할 수있는 다른 인덱스를 만드는 경우 나중에이 인덱스가 자동으로 삭제 될 수 있습니다. index_name이 주어지면 앞에서 설명한대로 사용됩니다.
강조 광산.
(*) 나는 거의 같은 때문에 거기에 약간의 미묘한 차이는 말한다.
인덱스
인덱스를 명시 적으로 이름을 준 첫 번째 버전에서
하지만 두 번째 버전에서 인덱스의 이름이 제약 조건의 이름과 같은 이름 (이 경우 지정됨).
버전 1 :
Table Non_unique Key_name Seq_in_index Column_name ...
title 1 order_number 1 order_number ...
버전 2 :
Table Non_unique Key_name Seq_in_index Column_name ...
title 1 order_number_fk 1 order_number ...
당신이 볼 수 있듯이, 여기에 유일한 차이점 이름입니다
두 경우 모두
SHOW INDEX
의 출력을 비교 색인
이 지수는 수도 :
자동
을 또 다른 미묘한 차이가 문서는 언급으로 두 번째 경우에, 자동으로 생성 된 인덱스가 자동으로 할 새 인덱스가 추가 될 때 감소 할 수 있다는 것입니다 삭제 외래 키 제약 조건을 적용하는 데 사용할 수있는 다른 인덱스를 만드는 경우 나중에 자동으로 삭제됩니다.
CREATE INDEX ix_order_number_title ON title (order_number, title);
그런 다음 다시 SHOW INDEX
을 실행합니다 :
버전 1 :
Table Non_unique Key_name Seq_in_index Column_name ...
title 1 order_number 1 order_number ...
title 1 ix_order_number_title 1 order_number ...
title 1 ix_order_number_title 2 title ...
를이 의미
나중에 예에 멀티 컬럼 인덱스, (order_number, title)
을 만드는 경우이다 버전 2 :
Table Non_unique Key_name Seq_in_index Column_name ...
title 1 ix_order_number_title 1 order_number ...
title 1 ix_order_number_title 2 title ...
이제 첫 번째 버전에는 두 개의 인덱스가 있지만 두 번째 버전에는 단 하나의 인덱스 만 있음을 알 수 있습니다. 두 번째 버전에서는 다중 열 인덱스가 추가 될 때 외래 키 제약 조건에 의해 자동으로 생성 된 인덱스가 자동으로 다시 삭제되었습니다. 일반적으로 새 색인은 원본 색인이 대부분 중복되기 때문에 심각한 문제는 아닙니다.
어느 것을 사용하고 싶습니까?
일반적으로 외래 키 제약 조건의 참조하는 테이블에 인덱스를 명시 적으로 작성하는 것에 대해 걱정할 필요가 없습니다.
그러나 경우 명시 적으로 인덱스를 생성 할 수 있습니다 : 당신이 그것을 제약의 이름과 다른 이름을 부여하는 것을 선호
- , 또는
- 당신은에 인덱스를 원하지 않는다 다른 색인이 추가되면 자동으로 사라집니다.
MyISAM에서도 마찬가지입니까? – lee
@lee MyISAM은 외래 키 제약 조건을 지원하지 않습니다. – David542
위대한 답변, 감사합니다! – David542