외래 키가 자동으로 인덱스를 생성합니까?


389

키 두 테이블을 외부 키로 사용하면 해당 SQL Server가 자식 테이블의 인덱스와 비슷한 것을 만들 것이라고 들었습니다. 나는 이것이 사실이라고 믿는 데 어려움을 겪지 만, 특별히 이것과 관련된 많은 것을 찾을 수는 없습니다.

이것을 묻는 나의 진짜 이유는 아마도 15 개의 관련 테이블이있는 테이블에 대해 delete 문에서 응답 시간이 매우 느리기 때문입니다. 데이터베이스 담당자에게 질문했는데 필드에 외래 키가 있으면 인덱스처럼 작동한다고 말합니다. 이것에 대한 당신의 경험은 무엇입니까? 모든 외래 키 필드에 인덱스를 추가해야합니까 아니면 불필요한 오버 헤드입니까?


FK가 실제로 색인을 생성한다는 사실을 DB 담당자와 동일하게 알고 있습니다.
Vinnie

9
아니요-FK는 인덱스를 자동으로 만들지 않습니다 . 하나를 만드는 것이 합리적이지만 SQL Server가 자동으로 수행 하지는 않습니다 .
marc_s

47
이걸 전혀 물어 보지 마라!
marc_s

5
느린 삭제를 얻고있는 테이블이 다른 테이블에 의해 참조에서 삭제하는 경우, 당신은 아마에서 외부 키 인덱싱하여 성능 향상을 얻을 것이다 다른 테이블을. SQL이 행을 삭제할 때 행에서 참조 무결성을 확인해야하기 때문입니다. 이를 위해서는 삭제하려는 행을 참조하는 다른 행이 없는지 확인해야합니다.
Noel Kennedy

3
나는 이것을 모르는 데이터베이스 녀석은 훈련이 심각하게 필요하다고 말하고 싶다. 데이터베이스 사람들은 성능에 책임이 있습니다. 이런 종류의 일을 아는 것은 그들의 일입니다. 이것은 심한 무능함을 암시합니다.
HLGEM

답변:


343

외래 키는 두 테이블 간의 관계인 제약 조건으로 인덱스 자체와는 아무런 관련이 없습니다.

그러나 FK 관계를 통해 관련 테이블을 조회하고 특정 행을 추출해야하기 때문에 외래 키 관계의 일부인 모든 열을 인덱싱하는 것이 의미가 있다는 것은 알려진 사실입니다. 단일 값 또는 값 범위

따라서 FK와 관련된 모든 열을 인덱싱하는 것이 좋지만 FK 자체는 인덱스가 아닙니다.

Kimberly Tripp의 훌륭한 기사 "SQL Server가 언제 외래 키 열에 인덱스를 추가하지 않았습니까?"를 확인하십시오. .


네. PostgreSQL이 색인을 생성한다는 것이 긍정적입니다. MySQL이 확실합니다. 인덱스를 만드는 것은 의미가 있지만 IT가 필요하지는 않습니다. 결국, DB가 조회 할 때마다 테이블 스캔을 수행해야하는 경우 왜 무언가를 참조해야합니까?
MBCook

위에서 언급 한이 기사는 SQL 서버 나 다른 데이터베이스가 FK에 색인을 설정하지 않기 때문에 혼란 스러울 수 있습니다.
vsingh

7
@vsingh : 이것이 바로 기사가 전달하려고하는 입니다. FK가 자동으로 인덱스를 생성한다는 것은 일반적인 오해 입니다. 그렇지 않습니다 .
marc_s

5
@MBCook 아니요, PostgreSQL은 (최소 9.2 이상 또는 이전 버전에서는)로 정의 된 외래 키 관계의 참조 쪽에서 인덱스를 자동으로 생성 하지 않습니다REFERENCES . 자동으로 또는 제약 조건에 UNIQUE대한 인덱스를 만들고 외래 키 관계 의 참조 끝에는 인덱스가 있어야 하지만 참조 끝에는 자동으로 아무 것도 수행하지 않지만 종종 스스로 만드는 것이 좋습니다. 참조 stackoverflow.com/questions/970562/...PRIMARY KEYUNIQUEUNIQUE
크레이그 벨소리

16
- MySQL의 InnoDB하지만 모두가 필요하며, 자동으로 당신이 외부 키를 추가 인덱스 생성하기 때문에 혼란은있을 수 dev.mysql.com/doc/refman/5.5/en/...
humbads을

42

와우, 답은지도 전체에 있습니다. 따라서 설명서 는 다음과 같이 말합니다.

FOREIGN KEY 제약 조건은 다음과 같은 이유로 인덱스 후보입니다.

  • PRIMARY KEY 제약 조건의 변경 사항은 관련 테이블의 FOREIGN KEY 제약 조건으로 확인합니다.

  • 외래 키 열은 한 테이블의 FOREIGN KEY 제약 조건의 열과 다른 테이블의 기본 또는 고유 키 열을 일치시켜 관련 테이블의 데이터를 쿼리에 결합 할 때 조인 조건에서 종종 사용됩니다. 인덱스를 사용하면 Microsoft® SQL Server ™ 2000이 외래 키 테이블에서 관련 데이터를 빠르게 찾을 수 있습니다. 그러나이 인덱스를 생성 할 필요는 없습니다. 테이블간에 PRIMARY KEY 또는 FOREIGN KEY 제약 조건이 정의되지 않은 경우에도 두 개의 관련 테이블의 데이터를 결합 할 수 있지만 두 테이블 간의 외래 키 관계는 키를 사용하는 쿼리에서 두 테이블이 결합되도록 최적화되었음을 나타냅니다. 그 기준.

따라서 실제로는 색인을 생성하지 않는다는 것이 상당히 명확 해 보입니다 (문서는 약간 혼잡하지만).


5
정확히- 인덱스 의 CANDIDATE 이지만 자동으로 하나 생성되지는 않습니다! 아주 실제로 취소, 이럴 :-)
marc_s

4
"두 테이블 간의 외래 키 관계는 두 테이블이 키를 기준으로 사용하는 쿼리에서 결합되도록 최적화되었음을 나타냅니다." "... 두 개의 테이블을 최적화해야합니다 ..."
Yishai

18

아니요, 외래 키 필드에 대한 암시 적 인덱스가 없습니다. 그렇지 않으면 Microsoft가 "외래 키에 인덱스를 만드는 것이 종종 유용합니다" 라고 말하는 이유는 무엇입니까 ? 기본 키 - 당신의 동료는 언급-에 테이블의 기본 키를 사용하여 참조 테이블의 외래 키 필드를 혼동 할 수 않는 암시 적 인덱스를 만들 수 있습니다.


"암시 적 인덱스"란 무엇입니까? 그것은 그것을 만들지 않고 ab * tree가 있음을 의미합니까?
Stephanie 페이지

1
@Stephanie Page : 방금 작성한 답변으로 자동 생성되는 인덱스를 의미합니다. 기본 키를 선언하면 SQL Server가 자동으로 키를 생성하고 색인을 생성합니다. 그러나 외래 키를 선언하지 않으면 (다른 DB 시스템에서는).
Michael Borgwardt 2016 년

7

SQL Server는 기본 키에 대한 인덱스를 자동으로 생성하지만 외래 키에 대한 인덱스는 자동으로 생성하지 않습니다. 외래 키에 대한 인덱스를 만듭니다. 아마도 오버 헤드의 가치가 있습니다.


6

주문이라는 큰 테이블과 고객이라는 작은 테이블이 있다고 가정하십시오. 주문에서 고객까지 외래 키가 있습니다. 이제 고객을 삭제하면 Sql Server는 고아 주문이 없는지 확인해야합니다. 있으면 오류가 발생합니다.

주문이 있는지 확인하기 위해 Sql Server는 대량 주문 테이블을 검색해야합니다. 색인이 있으면 검색이 빠릅니다. 없으면 검색 속도가 느려집니다.

따라서이 경우 느린 삭제는 인덱스가없는 것으로 설명 할 수 있습니다. 특히 Sql Server가 인덱스없이 15 개의 큰 테이블을 검색해야하는 경우.

PS 외래 키에 ON DELETE CASCADE가있는 경우 Sql Server는 여전히 주문 테이블을 검색해야하지만 삭제 된 고객을 참조하는 주문을 제거해야합니다.


정확하게-그것이 FK의 지수가 많은 의미를 갖는 이유입니다 (대부분의 경우)
marc_s

1
대부분의 시간? 이것은 부모에서 삭제하는 경우 인 것 같습니다. 대부분의 경우 부모님에게서 삭제하면 사실입니다.
Stephanie 페이지

6

외래 키는 인덱스를 만들지 않습니다. 대체 키 제약 조건 (UNIQUE)과 기본 키 제약 조건 만 인덱스를 만듭니다. 이것은 Oracle 및 SQL Server에서 마찬가지입니다.


3

내 지식이 아닙니다. 외래 키는 자식 키의 값이 부모 열의 어딘가에 표시되어야한다는 제약 조건 만 추가합니다. 자식 키도 인덱싱해야하며 제한되어야한다고 데이터베이스에 알리지 않습니다.


3

엄밀히 말하면 외래 키는 인덱스와 전혀 관련이 없습니다. 그러나 위의 스피커가 지적했듯이 FK 조회 속도를 높이기 위해 스피커를 만드는 것이 좋습니다. 실제로 MySQL에서는 FK 선언에 인덱스를 지정하지 않으면 엔진 (InnoDB)이 자동으로 인덱스를 만듭니다.


3

PostgeSql에서 \ d tablename을 누르면 인덱스를 직접 확인할 수 있습니다

기본 키와 고유 제약 조건이있는 열에는 외래 키가 아닌 열에 btree 인덱스가 자동으로 생성 된 것을 볼 수 있습니다.

나는 적어도 postgres에 대한 귀하의 질문에 대답한다고 생각합니다.


죄송합니다. 질문이 MS SQL Server에 관한 것이지만 답변을 게시 한 후에는 알 수 없습니다. 그것은 여전히 ​​누군가를 도울 수 있습니다 ...
Gregor

2

MSSQL을 가리키는 Entity Framework 6.1은 외래 키에 인덱스를 자동으로 추가합니다.


수동으로 열을 인덱스의 일부로 플래그 지정하면 (예 : 여러 멤버에 대해 복합 인덱스를 작성하는 경우)
Rowland Shaw

0

InnoDB외래 키 검사가 빠르며 테이블 스캔이 필요하지 않도록 외래 키 및 참조 키 에 대한 인덱스 가 필요합니다. 참조 테이블 에는 외래 키 열이 동일한 순서로 첫 번째 열로 나열 되는 인덱스 가 있어야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.