SQL의 인덱스 란 무엇입니까?


440

SQL 의 인덱스 란 무엇입니까 ? 명확하게 이해하기 위해 설명하거나 참조 할 수 있습니까?

인덱스는 어디에서 사용해야합니까?

답변:


377

색인은 데이터베이스에서 검색 속도를 높이는 데 사용됩니다. MySQL은 다른 SQL 서버와 관련하여 주제에 대한 훌륭한 문서를 가지고 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

인덱스를 사용하면 쿼리에서 일부 열과 일치하는 모든 행을 효율적으로 찾은 다음 테이블의 해당 하위 집합 만 검색하여 정확히 일치하는 항목을 찾을 수 있습니다. WHERE절의 열에 인덱스가없는 경우 SQL서버는 전체 테이블 을 살펴보고 모든 행을 검사하여 일치하는지 확인해야합니다. 이는 큰 테이블에서 느리게 작동 할 수 있습니다.

인덱스는 UNIQUE인덱스 일 수도 있습니다. 즉, 해당 열에 중복 값을 가질 수 없거나 PRIMARY KEY일부 스토리지 엔진에서 데이터베이스 파일에서 값이 저장되는 위치를 정의합니다.

MySQL에서는 명령문 EXPLAIN앞에서 SELECT쿼리가 인덱스를 사용하는지 확인할 수 있습니다. 성능 문제를 해결하기위한 좋은 시작입니다. 자세한 내용은 여기를 참조하십시오 : http://dev.mysql.com/doc/refman/5.0/en/explain.html


"인덱스도 고유 인덱스 일 수 있습니다 ..."당신과 함께 확인하기 위해 인덱스가 비 유니크 일 수도 있다는 의미입니까? 나는 항상 고유하다고 생각했습니다. 저는 SQL을 처음
접했습니다.

@DanielKurniadi 대부분의 인덱스는 고유하지 않습니다. 사용자 데이터베이스가 있고 예테보리에 사는 모든 사람을 쿼리하려고 할 수 있습니다. "도시"필드의 색인은 쿼리 속도를 높입니다. 그러나 예테보리에는 1 명 이상의 사용자가 살고 있으므로 인덱스는 고유하지 않아야합니다.
Emil Vikström

174

클러스터 된 인덱스는 전화 번호부의 내용과 같습니다. '힐 디치, 데이비드'에서 책을 열고 바로 옆에있는 '힐 디치'에 대한 모든 정보를 찾을 수 있습니다. 여기서 클러스터형 인덱스의 키는 (성, 이름)입니다.

이렇게하면 모든 데이터가 나란히 위치하므로 클러스터 기반 인덱스는 범위 기반 쿼리를 기반으로 많은 데이터를 검색하는 데 유용합니다.

클러스터형 인덱스는 실제로 데이터가 저장되는 방식과 관련이 있기 때문에 테이블 당 하나만 가능합니다 (여러 개의 클러스터형 인덱스를 시뮬레이트하기 위해 속일 수는 있음).

비 클러스터형 인덱스는 많은 인덱스를 가질 수 있고 클러스터형 인덱스의 데이터를 가리키는 점에서 다릅니다. 예를 들어 전화 번호부 뒤에있는 비 클러스터형 인덱스 (도시, 주소)를 가질 수 있습니다.

'런던'에 사는 모든 사람들을 위해 전화 번호부를 검색해야한다고 가정 해 봅시다. 클러스터 된 인덱스 만 있으면 클러스터 된 인덱스의 키가 켜져 있기 때문에 전화 번호부의 모든 단일 항목을 검색해야한다고 상상해보십시오. firstname) 그리고 결과적으로 런던에 사는 사람들은 지수 전체에 무작위로 흩어집니다.

(도시)에 비 클러스터형 인덱스가있는 경우 이러한 쿼리를 훨씬 빠르게 수행 할 수 있습니다.

희망이 도움이됩니다!


151

아주 좋은 비유는 데이터베이스 색인을 책의 색인으로 생각하는 것입니다. 국가에 관한 책을 가지고 있고 인도를 찾고 있다면 왜 책 전체를 넘겨보아야합니까? 데이터베이스 용어의 전체 테이블 스캔에 해당하는 것입니다. 인도에서 정보를 찾을 수있는 정확한 페이지를 알려줍니다. 마찬가지로 책 색인에 페이지 번호가 포함되어 있으므로 데이터베이스 색인에는 SQL에서 검색중인 값이 포함 된 행에 대한 포인터가 포함됩니다.

여기 더


2
숙련 된 사람들이 "분석"을 사용하여 설명하는 것에 감탄합니다. +1
snr

82

인덱스는 쿼리 성능을 향상시키는 데 사용됩니다. 방문 / 스캔해야하는 데이터베이스 데이터 페이지 수를 줄임으로써이를 수행합니다.

SQL Server에서 클러스터형 인덱스는 테이블의 실제 데이터 순서를 결정합니다. 테이블 당 하나의 클러스터형 인덱스 만있을 수 있습니다 (클러스터형 인덱스는 테이블 임). 테이블의 다른 모든 인덱스는 비 클러스터형이라고합니다.


49

인덱스는 모두 데이터를 빠르게 찾는 것 입니다.

데이터베이스의 색인은 책에서 찾은 색인과 유사합니다. 책에 색인이 있고 해당 책에서 장을 찾도록 요청하면 색인을 사용하여 해당 장을 빨리 찾을 수 있습니다. 반면에 책에 색인이 없으면 책의 처음부터 끝까지 모든 페이지를보고 장을 찾는 데 더 많은 시간을 소비해야합니다.

비슷한 방식으로 데이터베이스의 인덱스는 쿼리가 데이터를 빠르게 찾는 데 도움이 될 수 있습니다. 색인을 처음 사용하는 경우 다음 비디오가 매우 유용 할 수 있습니다. 사실, 나는 그들로부터 많은 것을 배웠습니다.

인덱스 기본 사항
클러스터형 및 비 클러스터형 인덱스
고유 인덱스 및 비 고유 인덱스 인덱스의
장단점


모든 답변을 읽으면 왜 모든 것을 색인화하지 않는지 궁금해했습니다. 단점이 포함 된 링크를 포함하면 +1입니다.
Lakshay Garg

@LakshayGarg 때로는 불필요한 인덱싱으로 인해 쿼리 실행 시간이 느려질 수 있으므로 모든 것을 인덱싱하지 마십시오. 모든 것이 그 자체의 장단점이 있습니다.
Gaurav Rajdeo 2016 년

@LakshayGarg Gaurav Rajdeo가 옳습니다. 똑같은 비유를 유지하십시오 : 모든 단락, 문장 또는 단어가 아니라 책의 모든 장이나 그림 또는 표를 색인화 할 수 있습니다. 일반적으로 이는 과잉이며 불필요한 합병증을 유발할 수 있습니다. 이 답변에서 그려진 그림에 충분히 가깝기를 바랍니다.
colidyre

23

일반적으로 인덱스는입니다 B-tree. 클러스터형 인덱스와 비 클러스터형 인덱스의 두 가지 유형이 있습니다.

클러스터형 인덱스는 물리적 인 행 순서를 만듭니다 (하나만 가능하며 대부분의 경우 기본 키이기도 함-테이블에서 기본 키를 생성하는 경우이 테이블에서도 클러스터형 인덱스를 생성 함).

비 클러스터 인덱스는 이진 트리이지만 물리적 순서의 행을 만들지는 않습니다. 따라서 비 클러스터형 인덱스의 리프 노드에는 PK (있는 경우) 또는 행 인덱스가 포함됩니다.

색인은 검색 속도를 높이는 데 사용됩니다. 복잡성이 O (log N)이기 때문에. 인덱스는 매우 크고 흥미로운 주제입니다. 큰 데이터베이스에서 인덱스를 만드는 것은 때때로 일종의 예술이라고 말할 수 있습니다.


6
일반적으로 이진 트리가 아닌 b- 트리입니다.
Mitch Wheat

인덱스는 자체 밸런싱 트리를 사용하기 때문에 행을 추가 / 삭제할 때마다 자체 균형을 유지하므로 삽입 / 삭제 비용이 높아집니다.
David Refaeli

20

INDEXES -쉽게 데이터를 찾기 위해

UNIQUE INDEX -중복 값은 허용되지 않습니다

구문 INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

구문 UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

먼저 인덱싱없이 정상적인 쿼리 실행 방법을 이해해야합니다. 기본적으로 각 행을 하나씩 순회하며 반환되는 데이터를 찾으면 반환됩니다. 다음 이미지를 참조하십시오. (이 이미지는이 비디오 에서 가져온 것입니다 .)

인덱싱없이 따라서 query가 50을 찾는다고 가정하면 선형 검색으로 49 개의 레코드를 읽어야합니다.

다음 이미지를 참조하십시오. (이 이미지는이 비디오 에서 가져온 것입니다 )

여기에 이미지 설명을 입력하십시오

인덱싱을 적용하면 쿼리는 이진 검색과 같이 각 순회에서 데이터의 절반을 제거하여 각 데이터를 읽지 않고 데이터를 빠르게 찾습니다. mysql 인덱스는 모든 데이터가 리프 노드에있는 B- 트리로 저장됩니다.


12

INDEX는 데이터 검색 프로세스를 가속화하는 성능 최적화 기술입니다. 해당 테이블 (또는 뷰)에서 데이터를 검색하는 동안 성능을 향상시키기 위해 테이블 ​​(또는 뷰)과 연결된 영구 데이터 구조입니다.

쿼리에 WHERE 필터가 포함 된 경우 인덱스 기반 검색이보다 구체적으로 적용됩니다. 그렇지 않으면 WHERE 필터가없는 쿼리는 전체 데이터와 프로세스를 선택합니다. INDEX없이 전체 테이블을 검색하는 것을 테이블 스캔이라고합니다.

Sql-Indexes에 대한 정확한 정보는 명확하고 신뢰할 수있는 방법으로 찾을 수 있습니다. 다음 링크를 따르십시오.

  1. 이해를 돕기 위해 : http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. 구현에 대한 이해 : http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

인덱스는 여러 가지 이유로 사용됩니다. 가장 큰 이유는 행을 얻거나 행을 더 빨리 정렬 할 수 있도록 쿼리 속도를 높이는 것입니다. 다른 이유는 기본 키 또는 고유 인덱스를 정의하여 다른 열이 동일한 값을 갖지 않도록하는 것입니다.


6

SQL Server를 사용하는 경우 최고의 리소스 중 하나는 설치와 함께 제공되는 자체 온라인 설명서입니다! 모든 SQL Server 관련 주제에 대해 언급 할 첫 번째 장소입니다.

실용적이라면 "어떻게해야합니까?" 질문이 있으면 StackOverflow가 더 나은 곳입니다.

또한, 한동안 돌아 오지 않았지만 sqlservercentral.com은 SQL Server 관련 사이트 중 최고의 사이트 중 하나였습니다.


0

색인은입니다 on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. 인덱스에는 테이블 또는 뷰의 하나 이상의 열로 작성된 키가 포함됩니다. 이러한 키는 SQL Server가 키 값과 관련된 행을 빠르고 효율적으로 찾을 수있는 구조 (B- 트리)에 저장됩니다.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

기본 키를 구성하면 클러스터 된 인덱스가 없으면 데이터베이스 엔진이 자동으로 클러스터 된 인덱스를 만듭니다. 기존 테이블에 PRIMARY KEY 제약 조건을 적용하려고 할 때 해당 테이블에 클러스터형 인덱스가 이미 존재하면 SQL Server는 비 클러스터형 인덱스를 사용하여 기본 키를 적용합니다.

인덱스 (클러스터 및 클러스터되지 않은)에 대한 자세한 내용은 https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-defined?view= sql-server-ver15

도움이 되었기를 바랍니다!

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