데이터베이스는 내부적으로 어떻게 작동합니까? [닫은]


80

저는 지난 몇 년 동안 데이터베이스 작업을 해왔고 데이터베이스 사용에 상당히 능숙 해 졌다고 생각합니다. 그러나 최근에 Joel의 Leaky Abstractions법칙 에 대해 읽었 으며 데이터베이스에서 원하는 거의 모든 것을 얻기 위해 쿼리를 작성할 수 있지만 데이터베이스가 실제로 쿼리를 어떻게 해석하는지 알 수 없다는 것을 깨달았습니다. 데이터베이스가 내부적으로 작동하는 방식을 설명하는 좋은 기사 나 책을 아는 사람이 있습니까?

내가 관심있는 몇 가지 구체적인 사항은 다음과 같습니다.

  • select 문과 일치하는 것이 무엇인지 알아 내기 위해 데이터베이스는 실제로 무엇을합니까?
  • 데이터베이스는 "where key1 = key2"문이 여러 개인 쿼리에 대해 조인을 어떻게 다르게 해석합니까?
  • 데이터베이스는 모든 메모리를 어떻게 저장합니까?
  • 인덱스는 어떻게 저장됩니까?

SQL 서버 인 경우에는 Inside Microsoft SQL Server 2005 시리즈 (Microsoft press), 특히 Storage Engine과 Querying에 대해 적극 권장합니다. 모든 질문에 대한 답변 등을 제공합니다. 다음 블로그에 관심이있을 수 있습니다. Craig Freedman Kalen Delaney Worth 도 SQLServerCentral을 구독하고 있습니다.
Gulzar Nazim

db.cs.berkeley.edu/papers/fntdb07-architecture.pdfWikiPedia를 사용해보십시오 . 이것은 RDBMS, FLATFILE 등과 같은 모델과 매우 큰 주제입니다. 파서는 실제로 가장 중요한 구성 요소 중 하나입니다. 감사합니다
Saif Khan

2
2015 년 현재 꽤 괜찮은 기사 가 있습니다.
Piovezan

데이터베이스의 내부 아키텍처는 복잡합니다. 이 기사 에서는 mysql 서버 및 스토리지 엔진의 자세한 작업을 설명합니다.
shashwat srivastava

답변:


83

select 문과 일치하는 것이 무엇인지 알아 내기 위해 데이터베이스는 실제로 무엇을합니까?

솔직히 말하면 무차별 대입의 문제입니다. 간단히 말해서 데이터베이스의 각 후보 레코드를 읽고 표현식을 필드와 일치시킵니다. 따라서 "select * from table where name = 'fred'"가 있으면 문자 그대로 각 레코드를 실행하고 "name"필드를 가져 와서 'fred'와 비교합니다.

이제 "table.name"필드가 인덱싱 된 경우 데이터베이스는 인덱스를 먼저 사용하여 실제 필터를 적용 할 후보 레코드를 찾습니다.

이것은 표현식을 적용 할 후보 레코드의 수를 줄입니다. 그렇지 않으면 우리가 "테이블 스캔"이라고 부르는 작업을 수행합니다. 즉, 모든 행을 읽습니다.

그러나 근본적으로 후보 레코드를 찾는 것은 실제 필터 표현식을 적용하는 방법과 별개이며 수행 할 수있는 몇 가지 현명한 최적화가 있습니다.

데이터베이스는 "where key1 = key2"문이 여러 개인 쿼리에 대해 조인을 어떻게 다르게 해석합니까?

음, 조인은 필터가 적용되는 새로운 "의사 테이블"을 만드는 데 사용됩니다. 따라서 필터 기준과 결합 기준이 있습니다. 조인 기준은이 "의사 테이블"을 작성하는 데 사용되며 그에 대해 필터가 적용됩니다. 이제 조인을 해석 할 때 필터와 동일한 문제입니다. "의사 테이블"에 대한 하위 집합을 빌드하기위한 무차별 대입 비교 및 ​​인덱스 읽기입니다.

데이터베이스는 모든 메모리를 어떻게 저장합니까?

좋은 데이터베이스의 핵심 중 하나는 I / O 버퍼를 관리하는 방법입니다. 그러나 기본적으로 RAM 블록을 디스크 블록과 일치시킵니다. 최신 가상 메모리 관리자를 사용하면 더 간단한 데이터베이스가 VM을 메모리 버퍼 관리자로 거의 의존 할 수 있습니다. 하이 엔드 DB는이 모든 것을 스스로 처리합니다.

인덱스는 어떻게 저장됩니까?

B + Trees는 일반적으로 찾아봐야합니다. 수년 동안 사용되어 온 간단한 기술입니다. 이점은 대부분의 균형 잡힌 트리와 공유됩니다. 노드에 대한 일관된 액세스와 모든 리프 노드가 연결되어있어 키 순서대로 노드간에 쉽게 이동할 수 있습니다. 따라서 인덱스를 사용하면 데이터베이스의 특정 필드에 대해 행이 "정렬"된 것으로 간주 될 수 있으며 데이터베이스는 해당 정보를 활용하여 최적화에 도움이 될 수 있습니다. 이것은 인덱스에 해시 테이블을 사용하는 것과는 다릅니다. 즉, 특정 레코드에 빠르게 도달 할 수만 있습니다. B- 트리에서는 특정 레코드뿐만 아니라 정렬 된 목록 내의 한 지점으로 빠르게 이동할 수 있습니다.

데이터베이스에 행을 저장하고 인덱싱하는 실제 메커니즘은 매우 간단하고 잘 이해됩니다. 이 게임은 버퍼를 관리하고 SQL을 효율적인 쿼리 경로로 변환하여 이러한 기본 스토리지 관용구를 활용합니다.

그런 다음 스토리지 관용구 외에 전체 다중 사용자, 잠금, 로깅 및 트랜잭션 복잡성이 있습니다.


8
저는 이것이 정말 흥미롭고 도움이되는 답변이라고 말하고 싶었습니다. 이 주제에 대해 더 긴 글을 썼습니까?
Nathan Long

이 날 어떻게 실제로 데이터베이스 작업 알아낼 도움이됩니다
Adzimzf

"그러면 데이터베이스는 (반드시 그런 것은 아니지만) 먼저 인덱스를 사용하여 실제 필터를 적용 할 후보 레코드를 찾습니다."어떤 경우에 인덱스가 사용되지 않는 이유와 그 이유는 무엇입니까?
Satyendra Kumar

1
@SatyendraKumar는 모든 종류의 것들에 의존하지만, 결국 최적화 프로그램 (통계 등을 기반으로)이 인덱스의 쿼리 결과가 테이블 행의 많은 부분이 될 것이라고 결정하면 무시하는 것이 더 저렴합니다. 대신 인덱스 및 테이블 스캔. 인덱스에는 많은 임의 I / O가 포함되며 비용이 발생합니다. 결국 그 비용은 단순히 테이블을 스캔하는 것보다 더 높습니다. 이와 같은 관리는 데이터베이스 튜닝 및 쿼리 최적화 프로세스의 한 측면 일뿐입니다.
Will Hartung

4
  • select 문과 일치하는 것이 무엇인지 알아 내기 위해 데이터베이스는 실제로 무엇을합니까?

    DB는 인덱스를 사용하고 있습니다 (아래 참조).

  • 데이터베이스는 "where key1 = key2"문이 여러 개인 쿼리에 대해 조인을 어떻게 다르게 해석합니까? 조인 작업은 트리를 병합하여 이진 트리 작업으로 변환 할 수 있습니다.

  • 데이터베이스는 모든 메모리를 어떻게 저장합니까?

    더 빠른 데이터 액세스를위한 메모리 맵 파일

  • 인덱스는 어떻게 저장됩니까?

    내부적으로 DB는 인덱싱을 위해 B-Tree 와 함께 작동 합니다.

이것은 wikipedia에 더 자세히 설명되어야합니다 ..

http://en.wikipedia.org/wiki/B-tree

http://en.wikipedia.org/wiki/Database


1

읽기 외에도 DB 도구를 사용하여 데이터베이스가 쿼리에 사용하는 실행 계획을 검사하는 것도 유익 할 수 있습니다. 작동 방식에 대한 통찰력을 얻는 것 외에도 더 나은 피드백 루프로 쿼리를 최적화하는 기술을 실험 할 수 있습니다.


0

사이프, 훌륭한 링크. 대부분의 주제를 다루고 특정 공급 업체 구현에 대한 세부 정보를 제공하는 조감도 개요.

설명을 쓰려고 세 번 시도했지만 너무 큰 주제입니다. Hellerstein 기사 (Saif가 연결 한 berkeley 서버의 기사)를 확인한 다음 세부 사항에 대해 질문하십시오.

주어진 DBMS에서 "알려진 좋은 아이디어"의 일부만 구현된다는 점은 주목할 가치가 있습니다. 예를 들어, SQLite는 해시 조인도하지 않고 중첩 루프 만 수행합니다 (ack !!). 하지만 쉽게 삽입 할 수있는 dbms이고 작업을 매우 잘 수행하므로 복잡성이 부족하다고 말할 수 있습니다.

DBMS가 통계를 수집하는 방법과이를 사용하여 쿼리 계획을 구성하는 방법에 대해 배우는 것은 물론 쿼리 계획을 읽는 방법을 배우는 것은 매우 중요한 기술입니다. 배우고, 이것을 배우십시오. 그것은 차이의 세계를 만들 것입니다 (그리고 우연히 Cartesian product를 다시 작성하지 않을 것입니다 ... ;-)).


0

더 자세히 알고 싶다면 sqlite 소스를 얻고 그것이 어떻게 작동하는지 살펴 보는 것이 좋습니다. 더 큰 오픈 소스 및 상용 데이터베이스의 규모는 아니지만 완벽합니다. 더 자세히 알고 싶다면 sqlite에 대한 훌륭한 설명 일뿐만 아니라 내가 아는 가장 읽기 쉬운 기술 서적 중 하나 인 The Definitive Guide to SQLite 를 추천 합니다. MySQL 측면에서는 MySQL 성능 블로그 와 블로그의 저자 중 한 명인 O'Reilly 고성능 MySQL (V2) 책 앞면 에서 배울 수 있습니다.

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