2010-07-18 4 views
6

외래 키 정의는 인덱스를 정의합니까? 나는 mysql을 가지고있다 v5.1.46 & 나는 MySQL 관리자 도구를보고 그 색인에 외래 키를 보여 주므로 확인하고 싶었다.MySQL 외래 키 질문

답변

3

예, MySQL 5.1은 외래 키 제약 조건을 정의 할 때 참조하는 테이블에 인덱스를 자동으로 생성합니다. MySQL은 외부 키에 대해 참조하는 테이블과 참조 된 테이블 모두에 인덱스를 요구합니다.

그러나 인덱스는 참조 테이블에서 만 자동으로 만들어지고 참조 테이블에서는 생성되지 않습니다.

CREATE TABLE orders (
    id int PRIMARY KEY, 
    code int, 
    name varchar(10) 
) ENGINE=INNODB; 

CREATE TABLE order_details (
    detail_id int PRIMARY KEY, 
    order_code int, 
    value int, 
    FOREIGN KEY (order_code) REFERENCES orders(code) 
) ENGINE=INNODB; 

ERROR 1005 (HY000): Can't create table 'test.order_details' 

자주 참조하는 외래 키 제약 조건을 생성 할 것 때문에 이것은 매우 흔한되지 않습니다 : MySQL은 당신이 인덱스를 사용할 수 없습니다 참조 된 테이블에서 필드를 참조하는 외래 키를 만들 수 없습니다 참조 된 테이블의 기본 키 및 기본 키는 자동으로 인덱싱됩니다. 그러나 아마도 염두에 두어야 할 가치가 있습니다. 문제를 해결할 것 orders 테이블의 code 필드에 인덱스를 생성

:

CREATE INDEX ix_orders_code ON orders(code); 
8
  • 이미 사용 가능한 인덱스 (외래 키 열이 첫 번째 열로 나열되어 인덱스가있는 경우 같은 순서로), 새로운 인덱스는 생성되지 않습니다.
  • 사용할 수있는 색인이없는 경우 외래 키를 작성하면 색인도 작성됩니다.

이 내용은 documentation에 있습니다.

InnoDB는 외래 키 검사가 빠르며 테이블 스캔이 필요하지 않도록 외래 키와 참조 키에 대한 인덱스가 필요합니다. 참조하는 테이블에는 외부 키 열이 같은 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다. 이러한 인덱스는 참조 테이블에 자동으로 작성됩니다 (존재하지 않는 경우). (인덱스를 명시 적으로 생성해야하거나 이전 버전의 외래 키 제약 조건 생성에 실패하는 이전 버전과는 대조적입니다.) index_name은 이전에 설명한대로 사용됩니다.

+0

설명서의 오래된 링크가 수정되었습니다. –