GN⁺: SQLite 인덱스 시각화
(mrsuh.com)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 쿼리 탐구 예정.
Hacker News 의견
-
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를 생성하여 더 적은 작업으로 더 다양한 레이아웃을 얻을 수 있음