programing

데이터베이스 인덱스는 어떻게 작동합니까?

elseif 2023. 4. 14. 21:17

데이터베이스 인덱스는 어떻게 작동합니까?

데이터 세트의 크기가 커짐에 따라 인덱싱이 매우 중요한 상황에서 데이터베이스에 구애받지 않는 수준에서 인덱싱이 어떻게 작동하는지 설명할 수 있습니까?

필드를 색인화하는 쿼리에 대한 내용은 데이터베이스 열을 색인화하는 방법을 참조하십시오.

왜 그것이 필요한가?

데이터가 Disk 기반 저장 장치에 저장되면 데이터 블록으로 저장됩니다.이러한 블록은 전체적으로 액세스되므로 원자 디스크 액세스 작업이 됩니다.디스크 블록은 링크된 목록과 거의 동일한 방식으로 구성되어 있습니다. 두 블록 모두 데이터 섹션, 다음 노드(또는 블록) 위치에 대한 포인터가 포함되어 있으며 둘 다 인접하게 저장할 필요가 없습니다.

할 수 되지 않은 검색이 합니다.(N+1)/2 액세스 「」(평균), 「」N는 테이블에 걸쳐 있는 블록 수입니다.가 키가 필드엔트리가 되지 않음인 경우 .N접속을 차단합니다.

을 사용할 수 . 은 이 검색을 이 검색은 다음과 같습니다.log2 N접속을 차단합니다.또한 데이터는 키가 아닌 필드가 지정되기 때문에 더 큰 값이 발견되면 나머지 테이블에서 중복된 값을 검색할 필요가 없습니다.이치노

인덱싱이란 무엇입니까?

인덱싱은 여러 필드에서 여러 레코드를 정렬하는 방법입니다.테이블의 필드에 인덱스를 작성하면 필드 값과 관련된 레코드에 대한 포인터가 유지되는 다른 데이터 구조가 생성됩니다.그런 다음 이 인덱스 구조가 정렬되어 이진 검색을 수행할 수 있습니다.

인덱스의 단점은 인덱스가 MyISAM 엔진을 사용하여 테이블에 함께 저장되기 때문에 동일한 테이블 내의 많은 필드가 인덱스화되면 이 파일은 기본 파일 시스템의 크기 제한에 빠르게 도달할 수 있다는 것입니다.

어떻게 작동합니까?

먼저 샘플 데이터베이스 테이블 스키마의 개요를 설명하겠습니다.

필드 이름 디스크의 데이터 유형 크기id(프라이머리 키) 부호 없음INT 4 바이트이름 문자(50) 50바이트성 문자(50) 50바이트emailAddress Char(100) 100바이트

주의: 디스크 값의 정확한 크기를 위해 varchar 대신 char를 사용했습니다.이 샘플 데이터베이스에는 500만 행이 포함되어 있으며 인덱싱되지 않았습니다.이제 몇 가지 쿼리의 성능을 분석합니다.는 ID(소트된 키 필드)를 사용하는 쿼리이며, firstName(키 이외의 정렬되지 않은 필드)을 사용하는 쿼리입니다.

1 - 정렬된 필드와 정렬되지 않은 필드

의 of of of of of of of of of of of 의 에 따라r = 5,000,000 「」의 .R = 204 크기 MyISAM을 됩니다.B = 1,024는 이이음음 음음음음음 음음음음 음음음음 of음 of of of of of of bytes of 。bfr = (B/R) = 1024/204 = 5★★★★★★★★★★★★★★★★★★★★★★★★★★★★★하는 데 의 총 는 이블을 required the the음음음 음음음 음음음음 음음음 the the the음 the the the the the the the the the the the the the the the the 。N = (r/bfr) = 5000000/5 = 1,000,000★★★★★★ 。

합니다.N/2 = 500,000.id 이므로 액세스를 합니다.그러나 id 필드도 정렬되어 있기 때문에 평균 2진수 검색을 수행할 수 있습니다.log2 1000000 = 19.93 = 20접속을 차단합니다.우리는 이것이 엄청난 발전이라는 것을 즉시 알 수 있다.

여기서 firstName 필드는 정렬도 키 필드도 아니기 때문에 바이너리 검색이 불가능하고 값도 고유하지 않습니다.따라서 테이블은 마지막까지 정확한 검색을 필요로 합니다.N = 1,000,000접속을 차단합니다.바로 이 상황에서 인덱스는 수정을 목표로 합니다.

인덱스 레코드에 인덱스된 필드와 원래 레코드에 대한 포인터만 포함되어 있는 경우, 이 레코드가 가리키는 다중 필드 레코드보다 작다는 것은 당연합니다.따라서 인덱스 자체는 원래 테이블보다 필요한 디스크 블록 수가 적기 때문에 반복하는 블록 액세스 수가 적습니다.firstName 필드의 인덱스 스키마는 다음과 같습니다.

필드 이름 디스크의 데이터 유형 크기이름 문자(50) 50바이트(레코드 포인터) 스페셜4 바이트

주의: MySQL 포인터의 길이는 테이블의 크기에 따라 2, 3, 4, 5바이트입니다.

2 - 인덱싱

의 of of of of of of of of of of of 의 에 따라r = 5,000,000가 " " "인덱스 레코드"인 :R = 54 「」를 사용하고 .B = 1,024는 " " " 입니다. 인덱스의 차단 계수는bfr = (B/R) = 1024/54 = 18★★★★★★★★★★★★★★★★★★★★★★★★★★★★★하는 데 한 총 는 덱스를 the the the음 the음 음음음음 음음음음 the the 음 the the the the the the the the the 。N = (r/bfr) = 5000000/18 = 277,778★★★★★★ 。

이제 firstName 필드를 사용한 검색에서는 인덱스를 사용하여 성능을 향상시킬 수 있습니다.이를 통해 평균이 다음과 같은 인덱스를 이진 검색할 수 있습니다.log2 277778 = 18.08 = 19접속을 차단합니다.레코드의 하려면 , 한층 더 , 가 「읽다」가 .19 + 1 = 20색인화되지 않은 테이블에서 firstName 일치를 찾기 위해 필요한 1,000,000개의 블록액세스와는 크게 다른 블록액세스입니다

언제 사용해야 하나요?

인덱스를 작성하려면 추가 디스크 공간(위의 예에서 277,778블록 추가, 최대 28% 증가)이 필요하며 인덱스가 너무 많으면 파일 시스템 크기 제한으로 인해 문제가 발생할 수 있으므로 인덱싱할 올바른 필드를 선택할 때 신중하게 고려해야 합니다.

인덱스는 레코드 내에서 일치하는 필드를 검색하는 데만 사용되므로 출력에만 사용되는 인덱스 필드는 삽입 또는 삭제 작업을 수행할 때 디스크 공간과 처리 시간을 낭비하므로 피해야 합니다.또한 바이너리 검색의 특성을 고려할 때 데이터의 카디널리티 또는 고유성이 중요합니다.카디널리티가 2인 필드에서 인덱스를 작성하면 데이터가 반으로 분할되지만 카디널리티가 1,000개 정도이면 레코드가 반환됩니다.이렇게 낮은 카디널리티로 인해 효과는 선형 정렬로 감소하며 쿼리 옵티마이저는 카디널리티가 레코드 번호의 30% 미만일 경우 인덱스를 사용하지 않도록 하여 인덱스를 효과적으로 공간 낭비로 만듭니다.

고전적인 예 "책의 색인"

각 섹션이 100페이지로 구성된 1000페이지 분량의 "책"을 10개의 장으로 나누어 생각해 보십시오.

간단하죠?

이제 연금술사라는 단어가 포함된 특정 장을 찾고 싶다고 상상해 보십시오.색인 페이지가 없으면 전체 책/장(예: 1000 페이지)을 스캔하는 것 외에 다른 옵션이 없습니다.

이 비유는 데이터베이스 세계에서는 "전체 테이블 스캔"으로 알려져 있습니다.

여기에 이미지 설명 입력

하지만 색인 페이지를 사용하면 어디로 가야 하는지 알 수 있습니다!또한 중요한 특정 장을 검색하려면 매번 인덱스 페이지를 반복해서 검토해야 합니다.일치하는 인덱스를 찾은 후 나머지 부분을 건너뛰면 해당 장으로 효율적으로 이동할 수 있습니다.

그러나 실제 1000페이지 외에 인덱스를 표시하려면 10페이지가 더 필요하므로 총 1010페이지가 필요합니다.

따라서 인덱스는 효율적인 조회를 위해 인덱스된 행에 대한 인덱스된 열 + 포인터의 값을 정렬된 순서로 저장하는 별도의 섹션입니다.

학교에서는 일이 간단하죠? : P

색인은 데이터베이스의 특정 열을 빠르게 검색할 수 있는 데이터 구조입니다.이 구조는 보통 b-tree 또는 해시 테이블이지만 다른 논리 구조일 수 있습니다.

처음 이 글을 읽었을 때 저에게 큰 도움이 되었습니다.감사해요.

로 인덱스 되었습니다.표.★★★★★★★★★★★★★★★★★★★★★★★★★★★★」UPDATE ★★★★★★★★★★★★★★★★★」INSERT)를 1개의 인덱스로 파일시스템에 실제로2개의 쓰기 조작이 있습니다.하나는 테이블 데이터용이고 다른 하나는 인덱스 데이터용입니다(및 테이블 데이터의 재지정(클러스터된 경우 테이블 데이터의 재지정).테이블과 인덱스가 같은 하드 디스크에 있는 경우는, 시간이 걸립니다. 쓰기 (가 2개 있으면 조작이 3개가 됩니다.) (2개)

그러나 인덱스 데이터와 테이블 데이터에 대해 두 개의 서로 다른 하드 디스크에서 두 개의 서로 다른 위치를 정의하면 시간 비용 증가 문제를 줄이거나 제거할 수 있습니다.이를 위해서는 원하는 하드디스크에 파일이 있는 추가 파일 그룹을 정의하고 필요에 따라 테이블/인덱스 위치를 정의해야 합니다.

인덱스의 또 다른 문제는 데이터가 삽입될 때 시간이 지남에 따라 분할된다는 것입니다. REORGANIZE도움이 됩니다. 루틴을 작성해야 합니다.

특정 시나리오에서는 인덱스가 있는 테이블보다 힙이 더 유용합니다.

예:- 리볼 수 있는 쓰기가 많지만 보고서 작성을 위해 야간 1회만 읽는 경우.

또한 클러스터된 인덱스와 비클러스터된 인덱스를 구별하는 것도 중요합니다.

도움이 되었습니다.- 클러스터된 인덱스와 클러스터되지 않은 인덱스는 실제로 무엇을 의미합니까?

이제 쿼리를 실행하여 'Abc'라는 이름을 가진 직원의 모든 세부 정보를 검색한다고 가정해 보겠습니다.

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

지표가 없다면 어떻게 될까요?

데이터베이스 소프트웨어는 말 그대로 Employee 테이블의 모든 행을 확인하여 해당 행의 Employee_Name이 'Abc'인지 확인해야 합니다.또한 Abc라는 이름을 가진 모든 행이 필요하기 때문에 Abc라는 이름을 가진 한 행만 찾으면 Abc라는 이름을 가진 다른 행이 있을 수 있기 때문에 찾는 것을 멈출 수 없습니다.따라서 마지막 행까지 모든 행을 검색해야 합니다. 즉, 이 시나리오에서는 이름이 'Abc'인 행을 찾기 위해 수천 개의 행을 데이터베이스에서 검사해야 합니다.를 전체 테이블 스캔이라고 합니다.

데이터베이스 인덱스가 성능에 도움이 되는 방법

인덱스를 사용하는 목적은 기본적으로 검사해야 하는 테이블 내의 레코드/행 수를 줄임으로써 검색 쿼리 속도를 높이는 것입니다.인덱스는 테이블의 특정 열에 대한 값을 저장하는 데이터 구조(일반적으로 B- 트리)입니다.

B-tree 인덱스는 어떻게 작동합니까?

B-트리가 인덱스에 가장 인기 있는 데이터 구조인 이유는 조회, 삭제 및 삽입이 모두 로그 시간으로 이루어지기 때문입니다.또한 B-트리가 더 많이 사용되는 또 다른 주요 이유는 B-트리에 저장된 데이터를 정렬할 수 있기 때문입니다.RDBMS는 일반적으로 인덱스에 실제로 사용되는 데이터 구조를 결정합니다.그러나 특정 RDBMS를 사용하는 시나리오에서는 인덱스 자체를 작성할 때 실제로 데이터베이스에서 사용할 데이터 구조를 지정할 수 있습니다.

해시 테이블 인덱스는 어떻게 작동합니까?

해시 인덱스가 사용되는 이유는 해시 테이블이 단순히 값을 검색할 때 매우 효율적이기 때문입니다.따라서 문자열과 동일한 값을 비교하는 쿼리는 해시 인덱스를 사용할 경우 매우 빠르게 값을 검색할 수 있습니다.

예를 들어 앞에서 설명한 쿼리는 Employee_Name 열에 작성된 해시 인덱스를 통해 도움이 될 수 있습니다.해시 인덱스는 컬럼 값이 해시 테이블의 키가 되고 해당 키에 매핑된 실제 값은 테이블 내의 행 데이터에 대한 포인터일 뿐입니다.해시 테이블은 기본적으로 연관 배열이므로 일반적인 엔트리는 "Abc => 0x28939"와 비슷합니다.여기서 0x28939는 Abc가 메모리에 저장되어 있는 테이블 행을 참조합니다.해시 테이블인덱스에서 "Abc"와 같은 값을 검색하고 메모리 내의 행에 대한 참조를 가져오는 것이 테이블을 스캔하여 Employee_Name 컬럼에서 값이 "Abc"인 모든 행을 찾는 것보다 훨씬 빠릅니다.

해시 인덱스의 단점

해시 테이블은 정렬된 데이터 구조가 아니며 해시 인덱스가 지원할 수 없는 여러 유형의 쿼리가 있습니다.예를 들어, 40세 미만의 모든 직원을 찾고 싶다고 가정합니다.해시 테이블 인덱스로 어떻게 그럴 수 있어요?해시 테이블은 키 값 쌍을 조회하는 데만 적합하기 때문에 가능하지 않습니다. 즉, 동등성을 확인하는 쿼리를 의미합니다.

데이터베이스 인덱스 안에 정확히 무엇이 있습니까?이제 데이터베이스 인덱스가 테이블의 열에 작성되고 인덱스가 특정 열에 값을 저장합니다.단, 데이터베이스 인덱스는 같은 테이블의 다른 열에 값을 저장하지 않습니다.예를 들어 [Employee_Name]컬럼에 인덱스를 작성하면 [Employee_]가 표시됩니다.Age 및 Employee_Address 열 값도 인덱스에 저장되지 않습니다.인덱스에 다른 모든 열을 저장하면 전체 표의 복사본을 만드는 것과 같습니다. 공간을 너무 많이 차지하여 매우 비효율적입니다.

데이터베이스는 색인 사용 시기를 어떻게 알 수 있습니까?SELECT * FROM Employee WHERE_Name = 'Abc'와 같은 쿼리를 실행하면 데이터베이스는 쿼리 중인 열에 인덱스가 있는지 확인합니다.Employee_Name 열에 인덱스가 작성되어 있다고 가정하면 데이터베이스에서는 인덱스를 사용하여 검색되는 값을 찾는 것이 실제로 적절한지 여부를 결정해야 합니다.데이터베이스 인덱스를 사용하는 것이 실제로는 효율적이지 않고 테이블 전체를 스캔하는 것만으로 효율이 높아지는 시나리오가 있기 때문입니다.

데이터베이스 인덱스를 보유하는 데 드는 비용은 얼마입니까?

공간을 차지합니다.테이블이 클수록 인덱스가 커집니다.인덱스의 또 다른 퍼포먼스는 대응하는 테이블의 행을 추가, 삭제 또는 갱신할 때마다 인덱스에 대해 동일한 작업을 수행해야 한다는 점입니다.인덱스는 인덱스가 커버하는 테이블 열에 있는 것과 동일한 분 단위 데이터를 포함해야 합니다.

일반적으로 인덱스는 인덱스된 열의 데이터를 자주 쿼리하는 경우에만 테이블에 생성해야 합니다.

「 」를 참조해 주세요.

  1. 일반적으로 어떤 열이 좋은 인덱스를 만드나요?
  2. 데이터베이스 색인 작동 방식

간단한 설명!

인덱스는 테이블의 특정 열에 대한 값을 저장하는 데이터 구조일 뿐입니다.테이블의 열에 인덱스가 생성됩니다.

: :은 '아까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이까이가있습니다.User.Name,Age ★★★★★★★★★★★★★★★★★」Address . . . . . . . . . . . . . . . .User테이블에는 수천 개의 행이 있습니다.

이제 'John'이라는 이름을 가진 사용자의 모든 세부 정보를 찾기 위해 쿼리를 실행한다고 가정해 보겠습니다.다음 쿼리를 실행하는 경우:

SELECT * FROM User 
WHERE Name = 'John'

는 문자 "Database Software"의 모든 해야 합니다.UserName예요.이 일은 시간이 오래 걸릴 것이다.

여기가 바로 그 장소입니다index도움이 됩니다: 인덱스는 검사해야 하는 테이블 내의 레코드/행 수를 기본적으로 줄임으로써 검색 쿼리 속도를 높이기 위해 사용됩니다.

인덱스 작성 방법:

CREATE INDEX name_index
ON User (Name)

index는 한 테이블의 열 값(예: John)으로 구성되며 이러한 값은 데이터 구조에 저장됩니다.

인덱스는 사용자 이름에 따라 알파벳 순으로 정렬되므로 데이터베이스는 인덱스를 사용하여 John이라는 직원을 찾습니다.또한 J로 시작하는 모든 이름이 색인에서 서로 바로 옆에 있기 때문에 이름을 검색하는 것이 훨씬 더 빠릅니다.

데이터베이스 색인을 책의 색인이라고 생각하면 됩니다.

만약 당신이 개에 관한 책을 가지고 있고 예를 들어, 독일 셰퍼드들에 대한 정보를 찾고 싶다면, 당신은 물론 책의 모든 페이지를 넘기고 당신이 찾고 있는 것을 찾을 수 있다. 하지만 이것은 물론 시간이 많이 걸리고 그리 빠르지는 않다.

또 다른 옵션은 책의 색인 섹션으로 이동한 후 찾고 있는 엔티티 이름(이 예에서는 독일 셰퍼드)을 사용하고 페이지 번호도 확인하여 원하는 항목을 빠르게 찾을 수 있습니다.

데이터베이스에서는 페이지 번호를 포인터라고 합니다.이 포인터는 엔티티가 있는 디스크의 주소로 데이터베이스를 안내합니다. 셰퍼드 ' '독일 셰퍼드', '0x77129'와 것이 수 .0x77129저먼 셰퍼드

즉, 인덱스는 쿼리 검색 속도를 높이기 위해 테이블에 특정 열의 값을 저장하는 데이터 구조입니다.

언급URL : https://stackoverflow.com/questions/1108/how-does-database-indexing-work