3P by neo 17일전 | favorite | 댓글 1개

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를 생성하여 더 적은 작업으로 더 다양한 레이아웃을 얻을 수 있음