인덱스

인덱스의 필요성

  • 인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치이다.

B-트리

  • 인덱스는 보통 B-트리라는 자료 구조로 이루어져있다.
  • B-트리는 이진 탐색 트리의 일종으로 탐색 성능을 높이기 위해 균형있게 높이를 유지하는 균형 트리 입니다.
  • 규칙에 따라 여러개의 자식노드를 가질 수 있다.

인덱스가 효율적인 이유와 대수확장성

  • 인덱스가 효율적인 이유는 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이의 대수확장성 때문이다.

인덱스 만드는 방법

  • MySQL의 경우 클러스터형 인덱스와 세컨더리 인덱스가 있다.
  • 클러스터형 인덱스
    • 테이블당 하나를 설정할 수 있다.
    • primary key 옵션으로 기본키를 만들면 클러스터형 인덱스를 생성할 수 있다.
    • 기본키가 아닌 unique not null 옵션을 붙이면 클러스터형 인덱스로 만들 수 있다.
  • 세컨더리 인덱스
    • 명령어를 기반으로 만들면 세컨더리 인덱스를 만들 수 있다.
    • 여러개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스

인덱스 최적화 기법

  • 인덱스는 비용이다.
    • 인덱스는 두 번 탐색하도록 강요한다. 인덱스 리스트 그다음 컬렉션 순으로 탐색하기 때문에 관련 읽기 비용이 들게 된다.
    • 컬렉션이 수정되었을 때 인덱스도 수정되어야 한다. 이때 많은 비용이 발생
    • 그렇기 때문에 쿼리에 있는 필드에 무작정 인덱스를 설정하는 것은 답이 아니다.
    • 데이터 양이 많을수록 인덱스를 사용하는 것은 비효율적이다.
  • 항상 테스팅 하라
    • EXPLAIN 함수를 통해 인덱스를 만들고 ㅜ커리를 보낸 이후에 테스팅을 하며 걸리는 시간을 최소화 해야 한다.
  • 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
    • 여러 필드를 기반으로 조회를 할 때 복합 인덱스를 생성하는데, 이 인덱스를 생성할 때는 순서가 있고, 생성 순서에 따라 인덱스 성능이 달라진다. 같음, 정렬, 다중값, 카디널리티 순으로 생성해야 한다.

조인

  • 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것을 말한다.
  • 내부 조인(inner join)
    • 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행이 있는 부분만 표기(교집합)
  • 왼쪽 조인(left outer join)
    • 왼쪽 테이블의 모든 행이 결과 테이블에 표기된다.
  • 오른쪽 조인(right outer join)
    • 오른쪽 테이블의 모든 행이 결과 테이블에 표기된다.
  • 합집합 조인(full outer join)
    • 두 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기한다.

내부 조인

  • 두 테이블 간의 교집합을 나타낸다.
  • SELECT * FROM tableA A INNER JOIN tableB B ON A.key = B.key

왼쪽 조인

  • 테이블 B의 일치하는 부분의 레코드와 함께 테이블 A를 기준으로 완전한 레코드 집합을 생성
  • 만약 B에 일치하는 항목이 없으면 해당 값은 null 값이 된다.
  • SELECT * FROM tableA A LEFT JOIN tableB B ON A.key = B.key

오른쪽 조인

  • 테이블 A에서 일치하는 부분의 레코드와 함께 테이블 B를 기준으로 완전한 레코드 집합을 생성
  • A에 일치하는 항목이 없으면 해당 값은 NULL이 된다.
  • SELECT * FROM tableA A RIGHT JOIN tableB B ON A.key = B.key

합집합 조인

  • 양쪽 테이블에서 일치하는 레코드와 함께 테이블 A와 테이블 B의 모든 레코드 집합을 생성
  • 일치하는 항목이 없으면 누락된 쪽에 NULL 포함
  • SELECT * FROM tableA A FULL OUTER JOIN tableB B ON A.key = B.key

조인의 원리

중첩 루프 조인

  • 중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법
  • 랜덤 접근에 대한 비용이 많아 대용량 테이블에서는 사용하지 않음
  • ex) 테이블 a에서 행 하나를 읽고 다음 반복문에서 조건에 맞는 레코드를 찾음

정렬 병합 조인

  • 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행
  • 조인 시에 적절한 인덱스가 없고 대용량 테이블들을 조인 조건으로 범위 비교 연산자가 있을 때 사용

해시 조인

  • 해시 테이블을 기반으로 조인
  • 두 테이블을 조인 시에 하나의 테이블이 메모리에 온전히 들어간다면 중첩 루피 조인보다 더 효율적이다.
  • 동등(=) 조인 에서만 사용할 수 있다.

'Computer science > 데이터베이스' 카테고리의 다른 글

트랜잭션과 무결성  (2) 2023.09.06

+ Recent posts