데이터베이스 인덱싱


12

데이터베이스에 익숙하지 않아서 색인 메커니즘을 이해하려고합니다.

내가 아는 바로는 RDBMS에서 열을 인덱싱하면 해당 열을 더 빨리 검색 할 수 있습니다. 트리플 스토어의 경우에도 마찬가지입니다. 인덱스는 주로 주제별로 검색 한 다음 객체별로 검색한다고 가정합니다.

RDBMS에 대해서는 확실하지 않지만 트리플 스토어에서는 두 개 이상의 인덱스를 정의 할 수있어 각 쿼리에 대해 스토어가 최상의 인덱스를 선택할 수 있습니다. 당연히 다음과 같은 질문이 나타납니다.

가능한 모든 인덱스를 트리플 스토어에 추가하고 RDBMS로 확장하지 않아야하는 이유는 무엇입니까 (각각 게으르지 않다고 가정)?

답변:


25

기본적으로 인덱스는 추가 테이블이므로 기본 키는 인덱싱 할 필드이고 유일한 내용은 기본 테이블의 기본 키입니다. 따라서 업데이트하는 필드를 사용하는 모든 인덱스에서 모든 업데이트를 복제해야합니다.

이것은 특히 인서트에서 두드러집니다. 테이블에 수행 한 모든 삽입을 20 개의 다른 테이블에 복제해야한다고 상상해보십시오. 고통스럽게 느려질 것입니다.

복합, 클러스터 및 전체 텍스트 인덱스의 경우에는 더욱 악화되지만 아직 문제를 복잡하게 만들고 싶지는 않습니다.


2

인덱스는 기본적으로 빌드 및 저장해야하는 추가 데이터 구조입니다. 실제로 작성하면 쓰기 작업 중 CPU 전원이 낭비되고 저장하면 디스크 용량이 낭비됩니다.

왜 절대 사용하지 않는 인덱스를 구축하고 저장하고 싶습니까?


순전히 이론적 인 질문입니다.
Dragos

@Dragos 나는 그 질문에 대한 대답이 내 게시물에서 분명하다고 생각합니다. 그렇게하면 모든 쓰기 작업이 훨씬 느려지고 모든 레코드가 많은 디스크 용량을 낭비하게됩니다. 왜 안돼? CPU 전력과 디스크 스토리지가 비싸기 때문입니다.
Matěj Zábský

2

필요할 때만 색인을 배치하십시오. 데이터베이스 스키마를 개발할 때 일반적으로 모든 테이블은 PK 기본 키 클러스터형 인덱스를 가져옵니다. 이는 해당 테이블의 데이터에 대한 고유 식별자입니다. 1 열 이상일 수 있습니다.

그런 다음 일반적으로 고유성을 유지하려는 열에 비 클러스터형 고유 인덱스를 추가합니다.

이것이 기본 스키마입니다. 응용 프로그램이 개발되고 성숙함에 따라 성능 문제와 데이터 쿼리 방법에 따라 필요에 따라 인덱스를 추가합니다.

추가 된 모든 인덱스는 사용 된 공간을 늘리고 유지 보수를 추가로 추가합니다. 따라서 색인을 현명하게 선택하십시오.


답변을 읽는 동안 다른 질문이 떠 올랐습니다. 기본 키는 일반적으로 자동으로 인덱싱됩니까, 아니면 인덱싱되도록 직접 지정해야합니까? 예를 들어 MySQL 데이터베이스에서?
Dragos

예. 기본 키는 (SQL Server)에 대한 클러스터형 인덱스를 자동으로 만들어야합니다. 기본 키는 하나뿐이므로 테이블 당 하나의 클러스터형 인덱스 만 있습니다. MySQL은 비슷해야하지만 MySQL 전문가가 유효성을 검사 할 수 있습니다.
Jon Raynor

2

인덱스의 장점은 1) 빠르게 검색 할 수있는 데이터 구조이고 2) 실제 테이블보다 더 컴팩트하여 디스크에 페이징되는 대신 더 많은 인덱스를 메모리에 맞출 수 있다는 것입니다.

모든 열에 인덱스가 있으면 인덱스 자체가 나타내는 테이블보다 많은 공간을 차지합니다. 데이터베이스가 실제로 모든 인덱스를 사용하는 경우 인덱스를 메모리 안팎으로 바꾸는 데 더 많은 시간이 필요합니다. 또한 모든 인덱스는 비활성, 업데이트 또는 삭제시 업데이트되어야합니다.

그 외에도 단일 열의 인덱스는 최선의 방법이 아닙니다. 대부분의 관계 데이터베이스는 실제로 여러 열에 대한 인덱스를 허용하며 이러한 열의 순서는 중요합니다. 예를 들어 1980 년에서 1984 년 사이의 클래스에서 Duke로 갔던 모든 사람들에 대한 데이터베이스를 검색하려면 원하는 것은 (School, ClassYear)에 대한 인덱스입니다. 쿼리는 동일한 열이 있지만 반대의 인덱스를 사용할 수 없습니다.

따라서 가능한 모든 인덱스 를 만들려면 적어도 n이 있습니다! 인덱스에서 열을 정렬하는 방법. 5 개의 열만 있으면 120 개의 가능한 인덱스가 있습니다.

가능한 인덱스가 너무 많기 때문에 실제로 응용 프로그램에 유용한 인덱스를 결정하고 인덱스 만 만들어야합니다.


그러나 귀하의 예에서 두 개의 색인, 즉 하나는 학교와 다른 하나는 ClassYear에 유용합니까?
Dragos

@Dragos 물론입니다. 수업이 끝났을 때 (2004 년에 학교에 다니는 모든 학생) 또 다른 질문이있는 경우, 수업 연도 지수가 유용 할 수 있습니다. 불행히도 쿼리 엔진이 언제 어떤 인덱스를 사용할지 결정할 때 사용하는 많은 요소가 있습니다. 2004 년에 데이터베이스에있는 사람들의 절반이 학교에 다니는 것으로 밝혀지면 데이터베이스 색인을 무시하고 전체 테이블을 스캔 할 수 있습니다. 이에 좋은 얻고 싶은 경우에, 사용하고 읽기 시작 실행 계획을
크리스 피트 맨

내가 의미하는 것은 School과 ClssYear에 대한 별도의 색인이있는 경우 1980 년에서 1984 년 사이에 수업에서 듀크에 갔던 모든 사람들을 검색 할 때 유용할까요?
Dragos

@Dragos 특정 DB 엔진에 따라 다릅니다. 예를 들어, Postgres는 여러 인덱스의 결과를 교차시키기 위해 비트 맵 인덱스 스캔 이라는 것을 사용 합니다. 사용할 인덱스를 결정하는 것은 쿼리 엔진에 달려 있으며, 이는 항상 DB에 따라 다릅니다.
Chris Pitman

2

테이블의 모든 열에 대한 인덱스를 만드는 것은 일반적으로 공간 낭비이며 다른 사람들이 언급했듯이 삽입 / 업데이트 작업이 느려질 수 있습니다. 인덱스는 쿼리 속도를 높이는 데 사용됩니다. 해당 열의 값을 쿼리 할 때 성능이 떨어지는 경우에만 열에 인덱스를 추가하는 것이 좋습니다.

일부 데이터베이스에는 테이블의 기본 키에 대한 인덱스가 필요할 수 있으므로 해당 테이블에 대한 선택 사항이 없을 수 있습니다. 또한 매우 큰 텍스트 열이있는 경우 전체 텍스트 검색 및 인덱스를 위해 설계된 특정 기술이 있지만 작은 숫자 열에 사용하는 것과 같은 종류의 인덱스는 아닙니다.

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