index
- 컬럼(또는 컬럼들)의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 갖고 있음
- 컬럼 값을 주어진 순서로 미리 정렬해서 보관
- SortedList - 인덱스 / ArrayList - 데이터파일
- SortedList 자료구조는 데이터가 저장될 때마다 항상 값을 정렬해야 하므로 저장하는 과정이 복잡하고 느리지만, 이미 정렬되어 있어서 아주 빨리 원하는 값을 찾아올 수 있다.
- 컬럼 값을 주어진 순서로 미리 정렬해서 보관
- 레코드 주소를 갖고 있는, 테이블과 매핑되어있는 오브젝트
- "레코드 주소"는 DBMS 종류나 MySQL의 스토리지 엔진에 따라 의미가 다르다.
- 물리적인 레코드 주소 : 오라클
- rowid : 데이터를 삽입할 때 DB 내부에서 자동적으로 생성하는 값, 해당 row의 고유한 주소 값 (MyISAM)
- 물리적인 레코드 주소 : 오라클
- "레코드 주소"는 DBMS 종류나 MySQL의 스토리지 엔진에 따라 의미가 다르다.
- 주의사항
- DML시 인덱스도 수정되어야 하므로 인덱스로 인한 성능저하, DML 잦은 컬럼은 인덱스에서 제외
- 따라서, 인덱스는 저장(INSERT, UPDATE, DELETE) 성능을 희생하고, 읽기 속도를 높이는 기능
- 인덱스 추가 여부는 데이터 저장속도를 어디까지 희생할 수 있는지, 읽기 속도를 얼마나 더 빠르게 만들어야 하는지 여부에 따라 결정
- where절, order by에 자주 사용되는 컬럼
- cardinality가 높은 컬럼으로
- cardinality : 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표
- 중복도가 '낮으면' 카디널리티가 '높다'
- 상대적인 개념
- cardinality : 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표
- 인덱스 컬럼이 변형되면 인덱스를 안타는 이유
- 인덱스는 가공되기 전의 값으로 생성 되어 있기 때문
- DML시 인덱스도 수정되어야 하므로 인덱스로 인한 성능저하, DML 잦은 컬럼은 인덱스에서 제외
- 인덱스 알고리즘 (MySQL)
- B-Tree (Balanced)
- 인덱싱 알고리즘 중 가장 일반적으로 사용되고, 먼저 도입된 알고리즘
- B-Tree는 컬럼의 원래 값을 변형시키지 않고, 항상 정렬된 상태로 유지
- 루트 / 브랜치 / 리프 노드
- 레코드 주소가 저장되는 곳은 리프노드
- Hash
- Fractal-Tree
- B-Tree (Balanced)
테이블스페이스
테이블 및 인덱스를 저장해놓은 논리적인 공간 (주로 오라클에서 쓰는 개념,,??)
MySQL은 InnoDB에서만
MySQL의 스토리지 엔진
- MyISAM
- select 위주일 경우
- 집계시에도 더 빠름
- Table-level Locking
- InnoDB
- 대용량 데이터를 컨트롤 하는 경우
- IUD 빈번한 경우 (Row-level Locking)
- 정렬 구문이 들어가는 경우 (압도적으로 더 빠름)
- 클러스터되어 디스크에 저장되므로, 기본적으로 PK 순서대로 정렬되어 저장됨
- 클러스터링? : 비슷한 값들은 최대한 모아서 저장하는 방식
CDC(Change Data Capture)
- DBMS들은 Create/update/Delete 같은 쓰기 작업 수행시, 해당 작업에 대한 request를 BackLog(일반적으로 Local파일)라는 곳에 저장함.
- 이 BackLog는 데이터를 쓰기전에 장애가 났을때, restart하면서 복구를 위한 용도로 사용됨
- CDC는 소스 DB로 부터 BackLog를 읽어서, 타겟 DB에 replay하는 형식
- 대표적인 제품으로 Golden Gate(Oracle), Share Flex, 오픈소스 제품으로는 Galera
Sharding
- 데이터베이스의 용량 한계를 극복하기 위한 기술, 데이터를 여러개의 데이터베이스에 나눠 담는 방법
- Vertical Sharding
- 연속된 데이터에 대해서 범위별로 데이터를 나눔
- Horizontal Sharding
- 연속된 키가 아니라 'Category'와 같은 종류에 따라 수평적으로 분리
- meaningful한 데이터를 key로 나눌 경우 특정 샤드에 데이터가 몰릴 수 있다. (해당 샤드에는 더 좋은 CPU와 메모리를 갖는 서버를 배치 하는 방법도 대안)
- 또는, 이를 피하기 위해 Hash방식으로 나눔
- ex. key는 시퀀스를 이용하고 이 값을 10으로 나눈 나머지 값으로 Shard를 결정
- 또는, 이를 피하기 위해 Hash방식으로 나눔
- 테이블 파티션과 다른건가?
- 파티션은 논리적으로 나뉜거고, 샤딩은 물리적으로도 나눈???
- 샤딩 = 수평 파티션 ??
'학습장 > Data Engineering' 카테고리의 다른 글
[DW] Dimensional Modeling (2) | 2022.11.24 |
---|---|
[DW] OLAP 정의와 목적 (3) | 2022.11.18 |
spark 실행구조 (0) | 2022.10.31 |
[spark] RDD란? (2) | 2022.10.24 |
pandas - stack() (2) | 2022.10.03 |
댓글