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

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

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



답변

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

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


답변

열이 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


답변

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

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

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


답변