데이터베이스를 사용하는 이유
- 대용량 데이터 처리
- 일반적인 자료구조로는 인메모리로만 사용 가능
- 디스크를 이용할 수 있어야 한다.
- 빠른 탐색이 가능해야 한다.
- 인덱스 (BTree 자료구조)
- 장애 발생 시 데이터 백업 및 복구
- 데이터가 사라지지 않도록 해야 한다.
- 데이터의 무결성을 위해 '트랜잭션' 개념 적용
- 해당 솔루션을 제공
- Redis의 경우 Replication 및 RDB / AOF 옵션
- 병렬성 제어가 어려움
- Lock 개념이 들어감.
- 성능과 상황에 따라 Table Lock / Row Lock 등을 사용할 수 있도록 해당 기능을 제공해 줌
- InnoDB의 경우 Isolation Level 옵션 등
NoSQL
- 기존 DB에서 충분한 성능이 나오지 않거나, 여러 서버를 구축하기 어려운 경우에 일부 기능을 삭제함으로써 이를 실현하는 것을 목표로 한다.
- 기존 DB에 비해 안정성이 떨어지는 것이 문제되고 있어서 기존 DB를 확장하여 이 문제를 해결하려는 노력도 보인다.
고정 길이 파일
- 해당 Row의 길이를 미리 고정하고 접근한다.
- 예를 들면 유저 ID * 100 바이트 위치가 실제 해당 유저의 데이터 위치이다.
- 빠르게 데이터 처리가 가능하다.
- 할당된 데이터를 모두 쓰지 않는 경우 메모리 낭비가 발생한다.
- 마치 운영체제에서 페이징 처리 시 내부 단편화가 일어나는 것과 같다.
인덱스
- BTree 를 기본으로 구현함
- Entry가 [Key, Byte Offset] 으로 구성됨
- 책의 목차 페이지와 비슷하다.
- 목차의 Entry는 [Key, Page] 로 구성되어 있다. 이를 이용
- 각각의 key마다 메모리 상의 실제 위치를 기록한다. 그래서 key 검색하면 곧바로 해당 메모리를 참조한다.
- key와 offset을 unsigned int로 하면 4byte, 약 40억까지 취급할 수 있어서 대부분 이것으로 충분하다.
해시 인덱스
- 인덱스만으로는 위에서 언급한 '고정 길이 파일' 방식과의 차이가 [Key, Byte Offset] 뿐이다. Key는 숫자, 문자열, 날짜/시간 등 여러가지가 있을 수 있으므로, 범용성을 생각하면 Hash를 이용해야 한다. 이런 방식을 해시 인덱스라 한다.
- Hash는 데이터의 양과 무관하게 동작하는 알고리즘이다. 시간복잡도는 O(1)이라 볼 수 있다.
- 하지만 데이터의 양이 많아질 수록 Hash Collision이 자주 발생할테니 완벽하게 무관하다고 할 수는 없다.
- 만능이 아니다.
- Hash값은 지정한 키 값과 같은 것만 찾을 수 있다. 그래서 범위 탐색이 불가능하다.
- Ex) 가격이 10000원 이하
- Ex) 제목이 "Final"로 시작
- 정렬에 있어서도 Hash는 도움이 되지 않는다.
- Ex) 가격이 싼 순서대로 정렬
- 참조 / 업데이트가 빠른 것이 장점이나 모든 문제를 해결하지는 못한다.
- 그래서 B+ Tree를 사용한다.
'DB' 카테고리의 다른 글
[Database][BTree] Clustered index & Non clustered index의 이해 (0) | 2016.09.25 |
---|---|
[DB] Oracle DB getting start (0) | 2014.07.17 |
[DB][Oracle 11g][Error solved] http://127.0.0.1:8080/apex/f?p=4950 뭐시기 에러 (0) | 2014.07.16 |
[DB] DB 강좌 사이트 (0) | 2014.07.16 |