select 문과 일치하는 것이 무엇인지 알아 내기 위해 데이터베이스는 실제로 무엇을합니까?
솔직히 말하면 무차별 대입의 문제입니다. 간단히 말해서 데이터베이스의 각 후보 레코드를 읽고 표현식을 필드와 일치시킵니다. 따라서 "select * from table where name = 'fred'"가 있으면 문자 그대로 각 레코드를 실행하고 "name"필드를 가져 와서 'fred'와 비교합니다.
이제 "table.name"필드가 인덱싱 된 경우 데이터베이스는 인덱스를 먼저 사용하여 실제 필터를 적용 할 후보 레코드를 찾습니다.
이것은 표현식을 적용 할 후보 레코드의 수를 줄입니다. 그렇지 않으면 우리가 "테이블 스캔"이라고 부르는 작업을 수행합니다. 즉, 모든 행을 읽습니다.
그러나 근본적으로 후보 레코드를 찾는 것은 실제 필터 표현식을 적용하는 방법과 별개이며 수행 할 수있는 몇 가지 현명한 최적화가 있습니다.
데이터베이스는 "where key1 = key2"문이 여러 개인 쿼리에 대해 조인을 어떻게 다르게 해석합니까?
음, 조인은 필터가 적용되는 새로운 "의사 테이블"을 만드는 데 사용됩니다. 따라서 필터 기준과 결합 기준이 있습니다. 조인 기준은이 "의사 테이블"을 작성하는 데 사용되며 그에 대해 필터가 적용됩니다. 이제 조인을 해석 할 때 필터와 동일한 문제입니다. "의사 테이블"에 대한 하위 집합을 빌드하기위한 무차별 대입 비교 및 인덱스 읽기입니다.
데이터베이스는 모든 메모리를 어떻게 저장합니까?
좋은 데이터베이스의 핵심 중 하나는 I / O 버퍼를 관리하는 방법입니다. 그러나 기본적으로 RAM 블록을 디스크 블록과 일치시킵니다. 최신 가상 메모리 관리자를 사용하면 더 간단한 데이터베이스가 VM을 메모리 버퍼 관리자로 거의 의존 할 수 있습니다. 하이 엔드 DB는이 모든 것을 스스로 처리합니다.
인덱스는 어떻게 저장됩니까?
B + Trees는 일반적으로 찾아봐야합니다. 수년 동안 사용되어 온 간단한 기술입니다. 이점은 대부분의 균형 잡힌 트리와 공유됩니다. 노드에 대한 일관된 액세스와 모든 리프 노드가 연결되어있어 키 순서대로 노드간에 쉽게 이동할 수 있습니다. 따라서 인덱스를 사용하면 데이터베이스의 특정 필드에 대해 행이 "정렬"된 것으로 간주 될 수 있으며 데이터베이스는 해당 정보를 활용하여 최적화에 도움이 될 수 있습니다. 이것은 인덱스에 해시 테이블을 사용하는 것과는 다릅니다. 즉, 특정 레코드에 빠르게 도달 할 수만 있습니다. B- 트리에서는 특정 레코드뿐만 아니라 정렬 된 목록 내의 한 지점으로 빠르게 이동할 수 있습니다.
데이터베이스에 행을 저장하고 인덱싱하는 실제 메커니즘은 매우 간단하고 잘 이해됩니다. 이 게임은 버퍼를 관리하고 SQL을 효율적인 쿼리 경로로 변환하여 이러한 기본 스토리지 관용구를 활용합니다.
그런 다음 스토리지 관용구 외에 전체 다중 사용자, 잠금, 로깅 및 트랜잭션 복잡성이 있습니다.