SQLite의 기본 키에 인덱스가 필요합니까?


130

정수 열이 SQLite 테이블에서 기본 키로 표시 될 때 인덱스도 명시 적으로 작성해야합니까? SQLite는 기본 키 열에 대한 인덱스를 자동으로 생성하지는 않지만 목적에 따라 인덱스를 생성합니까? (나는 항상 그 열을 검색 할 것입니다).

문자열 기본 키의 상황이 달라 집니까?

답변:


149

그것은 당신을 위해 그것을합니다.

INTEGER PRIMARY KEY 열을 제외하고 UNIQUE 및 PRIMARY KEY 제약 조건은 데이터베이스에서 인덱스를 만들어 "CREATE UNIQUE INDEX"문과 같은 방식으로 구현합니다. 이러한 인덱스는 데이터베이스의 다른 인덱스와 마찬가지로 쿼리를 최적화하는 데 사용됩니다. 결과적으로 이미 UNIQUE 또는 PRIMARY KEY 제약 조건이 이미 적용되는 열 집합에서 인덱스를 만들 때 이점 (그러나 상당한 오버 헤드)이없는 경우가 많습니다.


8
실제로 "PRIMARY KEY 속성은 일반적으로 PRIMARY KEY로 지정된 열에 UNIQUE 인덱스를 만듭니다"라고 표시되어 있습니다. 그러나 SQLite 관리 응용 프로그램에는 해당 인덱스가 표시되지 않으므로 요청했습니다.
Marek Jedliński

1
그것은에 언급의 sqlite_master이름과 함께 시작하는 테이블 sqlite_autoindex_.
dan04

2
늦은하지만 @NicolasZozol 예 당신이 필요 만들 UNIQUE지수 (또는 UNIQUE부모 / 참조 필드가 존재하지 않는 경우 (들)에 대한 제약); 되는 권장 아이 / 필드를 참조 (들) (일반적으로 고유하지 않습니다) 인덱스가 있는지 : 여기 참조
TripeHound

2
흠, SQL Data Constraints 여기에 나와 있습니다 : 대부분의 경우 UNIQUE 및 PRIMARY KEY 제약 조건은 데이터베이스에서 고유 인덱스를 생성하여 구현됩니다. WITHOUT ROWID 테이블의 INTEGER PRIMARY KEY 및 PRIMARY KEY는 예외입니다. 답이 항상 사실이 아닙니까?
장난 호기심

3
rowid IS는 색인화되었지만 다르게 구현됩니다. sqlite.org/lang_createtable.html#rowid rowid 테이블의 데이터는 rowid 값을 키로 사용하여 각 테이블 행에 대해 하나의 항목을 포함하는 B-Tree 구조로 저장됩니다. 특정 rowid를 가진 레코드의 경우 ... 다른 PRIMARY KEY 또는 색인 값을 지정하여 수행 한 유사한 검색보다 약 두 배 빠릅니다.
matreshkin

15

열이 INTEGER PRIMARY KEY로 표시되면 실제로 다른 PRIMARY KEY 또는 색인 값을 지정하여 수행 한 유사한 검색보다2 배 빠릅니다 . 이 때문입니다:

... SQLite 테이블 내의 모든 행에는 테이블 내의 행을 고유하게 식별하는 64 비트 부호있는 정수 키가 있습니다. 특정 rowid를 가진 레코드를 검색하거나 지정된 범위 내의 rowid를 가진 모든 레코드를 검색하는 것은 다른 PRIMARY KEY 또는 색인 값을 지정하여 유사한 검색으로 빠르게 수행하십시오.

아래에 언급 된 한 가지 예외를 제외하고, rowid 테이블 에 단일 열로 구성된 기본 키가 있고 해당 열의 선언 된 유형이 대소 문자를 혼합하여 "INTEGER"인 경우 열은 rowid의 별명이됩니다.

이러한 열을 일반적으로 "정수 기본 키"라고합니다. 선언 된 유형 이름이 정확히 "INTEGER"인 경우 PRIMARY KEY 열은 정수 기본 키만됩니다. "INT"또는 "BIGINT"또는 "SHORT INTEGER"또는 "UNSIGNED INTEGER"와 같은 다른 정수 유형 이름은 기본 키 열이 rowid의 별명이 아닌 정수 선호도와 고유 색인을 가진 일반 테이블 열로 작동하게합니다.

참조 : http://www.sqlite.org/lang_createtable.html#rowid


8

데이터베이스는 항상 자동으로 고유 한 기본 키에 대한 인덱스를 작성하므로 내부적으로 효율적으로 고유한지 확인할 수 있습니다.

그것을 만든 후에는 필요할 때 사용합니다.

물론 항상 클러스터되지는 않으며 원하는 경우 일반적으로 스키마에서 지정합니다.

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