# SQLite 인덱스 시각화

> Clean Markdown view of GeekNews topic #17787. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17787](https://news.hada.io/topic?id=17787)
- GeekNews Markdown: [https://news.hada.io/topic/17787.md](https://news.hada.io/topic/17787.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-16T09:39:07+09:00
- Updated: 2024-11-16T09:39:07+09:00
- Original source: [mrsuh.com](https://mrsuh.com/articles/2024/sqlite-index-visualization-structure/)
- Points: 3
- Comments: 1

## Topic Body

### SQLite 인덱스 시각화: 구조

- **인덱스의 중요성**: SQLite는 브라우저, 모바일 앱, 운영 체제에서 널리 사용되는 DBMS로, 인덱스 구조를 이해하고 디스크와 메모리에서의 저장 방식을 탐구하는 데 적합함.

#### 노드와 페이지 구조

- **B-트리 구조**: SQLite의 인덱스는 B-트리 구조로 저장되며, 각 노드는 여러 자식을 가짐.
- **페이지와 셀**: 페이지는 셀 데이터를 저장하고 오른쪽 자식 페이지로의 링크를 가짐. 셀은 인덱스 데이터, rowId, 왼쪽 자식 페이지로의 링크를 포함함.

#### SQLite 소스 코드 분석

- **코드 예시**: 인덱스 분석을 위한 함수 작성. 예를 들어, `sqlite3DebugBtreeIndexDump` 함수는 선택된 인덱스의 내용을 읽고 출력함.
- **도커 사용**: 도커를 사용하여 인덱스 덤프를 테스트할 수 있음.

#### 인덱스 시각화

- **시각화 도구**: d3-org-tree 라이브러리를 사용하여 인덱스 구조를 시각화하려 했으나, 텍스트로 구조를 표시하는 것이 더 간단함.
- **PHP ImageMagick**: PHP의 ImageMagick 확장을 사용하여 디자인과 간격을 제어할 수 있는 이미지를 생성함.

#### 다양한 인덱스 예시

- **기본 인덱스**: 1개의 레코드로 구성된 간단한 인덱스.
- **다양한 레코드 수**: 1,000개 및 1,000,000개의 레코드를 가진 인덱스.
- **정렬 방향 비교**: ASC와 DESC 정렬 방향의 인덱스 비교.
- **표현식 기반 데이터**: 표현식을 사용하여 인덱스를 생성.
- **NULL 값을 포함한 고유 인덱스**: SQLite는 NULL 값을 가진 고유 인덱스를 지원함.
- **부분 인덱스**: NULL 값을 필터링하여 인덱스를 생성.
- **다중 열 인덱스**: 여러 열을 포함하는 인덱스 생성.

#### 인덱스 최적화

- **VACUUM 및 REINDEX**: 기존 인덱스를 최적화하기 위해 사용되는 명령어.
- **텍스트 데이터**: 짧은 문자열은 인덱스 셀에 직접 저장되며, 긴 텍스트는 별도로 저장됨.
- **부동 소수점 데이터**: 부동 소수점 데이터를 포함한 인덱스 생성.

#### 결론

- **인덱스 구조 이해**: SQLite의 인덱스 구조와 B-트리의 데이터 저장 및 접근 방식을 이해함.
- **시각화의 중요성**: 시각화를 통해 다양한 인덱스를 분석하고 비교할 수 있었음.
- **향후 계획**: 인덱스 기반 검색 시각화 및 흥미로운 SQL 쿼리 탐구 예정.

## Comments



### Comment 31348

- Author: neo
- Created: 2024-11-16T09:39:07+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42134964) 
- SQLite 테이블의 각 행은 기본적으로 고유한 rowId를 가지며, 이는 명시적으로 정의되지 않은 경우 기본 키처럼 작동함
  - 실제로 기본 키가 있어도 rowId를 사용함
  - WITHOUT ROWID 테이블의 기본 키 인덱스를 시각화해보는 것이 좋음
  - 두 인덱스는 유사해 보이지만, 페이지 수가 적은 두 번째 인덱스가 더 빠를 수 있음
  - 노드 수가 적다고 해서 반드시 "빠른" 것은 아님
  - 가장 중요한 것은 트리의 높이임
  - 두 번째로 중요한 것은 인덱스에서 값을 찾았을 때 발생하는 일임
  - 별도의 테이블(rowid)에서 나머지를 로드해야 하는지, 아니면 데이터가 이미 있는지(ROWID 없이) 특히 범위 쿼리에서 중요함

- 데이터베이스 관리 시스템(DBMS)이 디스크와 메모리에서 인덱스를 저장하고 검색하는 방법을 보고 싶었음
  - SQLite를 실험 대상으로 선택함
  - SQLite는 모든 것을 처리하는 방식에서 약간의 특이점이 있음
  - 특히 쿼리 처리에서 더 그러함
  - SQLite는 성능보다 단순함을 선호하는 경향이 있어 다른 데이터베이스와 다르게 구현함
  - SQLite는 다른 데이터베이스와 경쟁하지 않음
  - JSON 및 XML 파일과 영구 저장을 위해 경쟁함
  - 이는 SQLite가 무엇이든 구현하는 방식이 실제 데이터베이스가 어떻게 작동하는지를 거의 알려주지 않음을 의미함

- 웹사이트가 매우 읽기 쉬워서 읽고 싶음

- "indexes"는 동사 "to index"의 3인칭 단수 현재형과 명사 "index"의 복수형으로 사용됨
  - 반면 "indices"는 전통적인 복수형으로 수학 및 과학 분야에서 특히 많이 사용됨
  - 일반 영어에서는 "indexes"가 흔히 사용되지만, 기술 분야에서는 언어적 정확성을 유지하기 위해 "indices"가 선호됨
  - "indices"를 사용하면 인덱싱 작업과 인덱스의 복수형을 구분하여 명확성을 높임

- PostgreSQL이 같은 작업을 수행하는 방법을 보고 비교하고 메모를 남기는 것이 좋을 것 같음

- yEd를 위한 tgf를 생성하여 더 적은 작업으로 더 다양한 레이아웃을 얻을 수 있음
