사전 인덱스
용어함정

인덱스

gabury1

인덱스는 맥락마다 뜻이 갈리는 말입니다. 갈리는 축은 그 인덱스가 데이터의 어느 층위에 놓이느냐입니다. 데이터베이스에서 부르는 인덱스와 Git 에서 부르는 인덱스는 이름만 같습니다. 맥락을 먼저 대지 않으면 뜻이 서지 않습니다.

상세

인덱스는 맥락마다 뜻이 갈립니다. 갈리는 축은 그 인덱스가 데이터의 어느 층위에 놓이느냐입니다. 데이터 옆에 붙는 보조 구조인 자리가 있습니다. 데이터를 담는 단위 자체인 자리가 있습니다. 구조가 아니라 값 하나인 자리도 있습니다.

관계형 데이터베이스에서 인덱스는 본 데이터와 따로 만들어 두는 보조 구조입니다. PostgreSQL 문서는 인덱스가 없으면 시스템이 테이블 전체를 행 단위로 훑어야 한다고 적습니다. 반환될 행이 몇 개뿐인데 테이블에 행이 많으면 이 방법은 비효율적입니다. 어느 칼럼에 인덱스를 유지하라고 지시하면 시스템은 일치하는 행을 찾는 데 더 효율적인 방법을 쓸 수 있습니다. 검색 트리를 몇 단계만 내려가면 되기도 합니다. 같은 문서가 이 구조를 논픽션 책 뒤에 붙는 색인에 빗댑니다.

Elasticsearch 에서는 층위가 뒤집힙니다. 여기서 인덱스는 저장 단위 자체입니다. 문서를 저장하려면 특정 인덱스에 넣고, 검색하려면 인덱스 하나 이상을 대상으로 지정합니다. 관계형 데이터베이스의 인덱스가 데이터 옆에 붙는 보조물이라면, 이쪽 인덱스는 데이터를 담는 그릇입니다.

flowchart TD
    subgraph A["관계형 데이터베이스"]
        A1["테이블"] --- A2["인덱스"]
    end
    subgraph B["Elasticsearch"]
        B1["인덱스"] --> B2["문서"]
    end

왼쪽에서는 테이블이 데이터를 들고 인덱스가 그 옆에 붙습니다. 오른쪽에서는 인덱스가 문서를 들고 있습니다. 같은 낱말이 한쪽에서는 붙는 쪽이고 다른 쪽에서는 담는 쪽입니다.

Git 의 인덱스에는 조회라는 말 자체가 없습니다. Git 용어집은 인덱스를 stat 정보가 딸린 파일들의 모음이자 저장된 워킹 트리의 판이라고 적습니다. git-add 문서는 같은 것을 스테이징 영역이라고도 부르며, 다음 커밋의 내용을 준비하는 데 쓰는 것이라고 적습니다. 무엇을 더 찾자는 구조가 아니라 무엇을 담아 커밋할지 모아 두는 자리입니다.

배열과 시퀀스에서 인덱스는 구조가 아니라 값 하나입니다. Python 언어 레퍼런스는 대상 타입에 따라 첨자를 키라고도, 인덱스라고도, 타입 인자라고도 부른다고 적습니다. 시퀀스에 붙는 첨자가 인덱스입니다. Khronos 의 glTF(GL Transmission Format, 그래픽 라이브러리 전송 포맷) 2.0 명세는 이 용법과 목록 용법을 한자리에서 씁니다.

어느 뜻이 원래 뜻인지는 이 문서들이 적지 않습니다. 그래서 인덱스라는 말만으로는 무엇을 가리키는지 정해지지 않습니다.

맥락별 뜻

맥락 뜻 출처
관계형 데이터베이스 본 데이터와 따로 만들어 두는 보조 구조. 테이블 전체를 훑지 않고 행을 찾게 한다 PostgreSQL Documentation 11.1 Introduction · CREATE INDEX Description
Git stat 정보가 딸린 파일들의 모음이자 저장된 워킹 트리의 판. 다음 커밋의 내용을 준비하는 자리 gitglossary index · index entry · git-add Description
검색엔진 — Elasticsearch 저장의 근본 단위. 문서를 넣고 검색 대상으로 지정하는 그릇 Elasticsearch Reference, Data in: documents and indices
배열·시퀀스 컨테이너에서 원소 하나를 고르는 첨자 값 Python Language Reference 6.3.2 Subscriptions and slicings
그래픽스 — glTF 정점 번호들을 담은 액세서를 가리키는 번호 glTF 2.0 5.24 Mesh primitive · Table 23

관계형 데이터베이스

PostgreSQL 문서는 인덱스를 만드는 이유를 대비로 설명합니다. 아무 준비가 없으면 시스템은 조건에 맞는 행을 모두 찾으려고 테이블을 행 단위로 전부 훑습니다. 인덱스가 있으면 그렇게 하지 않아도 됩니다.

인덱스는 따로 만드는 대상입니다. CREATE INDEX 는 지정한 릴레이션의 지정한 칼럼 위에 인덱스를 구성합니다. 릴레이션은 테이블일 수도 있고 구체화 뷰일 수도 있습니다. 문서는 인덱스가 주로 데이터베이스 성능을 높이는 데 쓰인다고 적으면서, 부적절하게 쓰면 오히려 성능이 떨어질 수 있다고 같은 문장에 덧붙입니다.

PostgreSQL 이 제공하는 인덱스 방식은 여섯 가지입니다. B-tree · 해시 · GiST(Generalized Search Tree, 일반화 검색 트리) · SP-GiST(Space-Partitioned Generalized Search Tree, 공간 분할 일반화 검색 트리) · GIN(Generalized Inverted Index, 일반화 역색인) · BRIN(Block Range Index, 블록 범위 인덱스) 입니다. WHERE 절을 붙이면 부분 인덱스가 만들어집니다. 부분 인덱스는 테이블의 일부에 대해서만 항목을 갖는 인덱스입니다. 문서는 그 일부가 대체로 나머지보다 인덱싱에 쓸모 있는 부분이라고 적습니다.

한 번 만든 뒤에는 사람이 더 개입할 일이 없습니다. 테이블이 바뀌면 시스템이 인덱스를 갱신합니다. 순차 테이블 스캔보다 인덱스를 쓰는 편이 더 효율적이라고 판단하면 질의에서 인덱스를 씁니다. 다만 질의 계획기가 판단할 근거인 통계를 갱신하려고 ANALYZE 명령을 정기적으로 돌려야 할 수도 있습니다.

Git

Git 용어집의 인덱스 정의에는 조회도 성능도 나오지 않습니다. 인덱스는 stat 정보가 딸린 파일들의 모음이고, 그 내용은 객체로 저장됩니다. 그리고 인덱스는 저장된 워킹 트리의 판입니다. 병합할 때 쓰이는 두 번째 판, 나아가 세 번째 판까지 담을 수도 있습니다.

인덱스 항목은 인덱스에 저장된 특정 파일에 관한 정보입니다. 병합을 시작하고 아직 끝내지 않았으면 인덱스 항목이 unmerged 일 수 있습니다. 인덱스가 그 파일의 판을 여럿 담고 있는 경우입니다.

git-add 문서가 쓰임새를 적습니다. 이 명령은 새로 생기거나 바뀐 파일의 내용을 인덱스에 더합니다. 인덱스는 스테이징 영역이라고도 불리며 다음 커밋의 내용을 준비하는 데 씁니다. 다른 인자 없이 git commit 을 돌리면 스테이징된 변경만 커밋됩니다. 더해지는 것은 명령을 돌린 시점의 내용뿐입니다. 그 뒤에 또 바꾼 것을 다음 커밋에 넣으려면 git add 를 다시 돌려야 합니다.

검색엔진

Elasticsearch 문서는 인덱스를 저장의 근본 단위이자 데이터를 다루는 층위라고 적습니다. 독립된 데이터셋 여럿을 나란히 둘 수 있습니다. 문서를 저장하려면 특정 인덱스에 더합니다. 검색하려면 인덱스 하나 이상을 대상으로 지정하고, Elasticsearch 는 그 안의 데이터를 모두 검색해 일치하는 문서를 돌려줍니다.

뒤에서는 인덱스마다 샤드로 쪼개져 클러스터의 노드들에 분산됩니다. 문서는 인덱스의 핵심 부분을 도큐먼트와 매핑과 세팅으로 듭니다.

배열과 시퀀스

Python 언어 레퍼런스는 첨자 문법을 컨테이너에서 원소 하나를 고르는 용도라고 적습니다. 첨자를 붙일 대상 뒤에 대괄호로 첨자를 씁니다. 첨자를 무엇이라 부르는지는 대상 타입이 정합니다. 매핑이면 키, 시퀀스면 인덱스, 제네릭 타입이면 타입 인자입니다. 문서는 이 셋이 문법적으로 모두 같다고 적습니다.

문서가 든 예에서 colors 는 red · blue · green · black 네 원소를 담은 리스트입니다. colors[3] 은 black 을 내줍니다. 여기서 인덱스는 대괄호 안에 들어가는 값 하나입니다. 따로 만들어 두는 구조가 아닙니다.

그래픽스

Khronos 의 glTF 2.0 명세는 메시 프리미티브를 주어진 머티리얼로 렌더할 지오메트리라고 적습니다. 관련된 WebGL(Web Graphics Library, 웹 그래픽 라이브러리) 함수로 drawElements 와 drawArrays 를 듭니다.

메시 프리미티브의 속성 표에서 indices 는 정수입니다. 정점 인덱스들을 담은 액세서의 인덱스입니다. 같은 표의 material 도 정수이고, 렌더할 때 이 프리미티브에 적용할 머티리얼의 인덱스입니다. 한 표 안에서 인덱스가 두 층위로 쓰입니다. 정점 번호들의 목록을 가리키는 쪽과, 다른 배열의 몇 번째 원소인지를 가리키는 정수 하나입니다. 뒤쪽은 배열과 시퀀스 맥락과 같은 용법입니다.

경계

테이블에 걸린 기본키나 유니크 제약도 인덱스인가. 아닙니다. 제약은 제약이고, 인덱스는 그 제약을 강제하는 수단입니다.

근거는 PostgreSQL 문서 11.6 에 있습니다. 인덱스는 한 칼럼 값의 유일성이나 여러 칼럼을 합친 값의 유일성을 강제하는 데도 쓸 수 있습니다. 테이블에 유니크 제약이나 기본키를 정의하면 PostgreSQL 이 유니크 인덱스를 자동으로 만듭니다. 그 인덱스는 기본키나 유니크 제약을 이루는 칼럼들을 덮습니다. 칼럼이 여럿이면 다중칼럼 인덱스가 됩니다. 문서는 그 인덱스가 제약을 강제하는 메커니즘이라고 적습니다.

같은 대목이 따름을 하나 적습니다. 유니크 칼럼에 인덱스를 손으로 또 만들 필요가 없습니다. 자동으로 만들어진 인덱스를 중복시킬 뿐입니다.

관련 항목

인덱스 뜻이 갈리는 맥락의 시스템·언어

데이터베이스 · PostgreSQL · Git · Elasticsearch · Python · Khronos · glTF

관계형 데이터베이스 인덱스의 하위 종류

B-tree · 해시 · GiST · SP-GiST · GIN · BRIN · 부분 인덱스 · 유니크 인덱스 · 다중칼럼 인덱스

인덱스를 만드는 명령과 그 대상

CREATE INDEX · 릴레이션 · 구체화 뷰 · 칼럼

인덱스 사용 여부를 판단하는 도구

순차 테이블 스캔 · 질의 계획기 · ANALYZE

인덱스가 강제하는 제약

기본키 · 유니크 제약

인덱스가 개선하는 작업과 지표

검색 · 성능

인덱스를 다루는 git 명령과 다른 이름

git add · git commit · 스테이징 영역

인덱스를 이루는 git 데이터 요소

블롭 · 워킹 트리 · 병합 · HEAD

인덱스를 이루는 검색엔진 구성 요소

도큐먼트 · 매핑 · 세팅

인덱스가 나뉘어 흩어지는 단위

샤드 · 클러스터 · 노드

인덱스를 다르게 부르는 이름

키 · 타입 인자

첨자 문법에서 인덱스와 나란한 형제

첨자 · 슬라이싱 · IndexError

인덱스가 필드로 들어 있는 자료 구조

메시 프리미티브

인덱스가 가리키는 대상

액세서 · 머티리얼 · 정점

인덱스 사용 여부로 갈리는 WebGL 렌더 함수

drawElements · drawArrays · WebGL

다른 이름: index