관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스입니다.
또한 RDMBS는 관계를 맺고 모여있는 테이블들의 집합체로 이해할 수 있습니다.
이러한 테이블 간의 관계에서 서로의 칼럼을 기준으로 Join이 가능하다는 게 RDBMS의 가장 큰 특징입니다.
NoSQL에서는 RDBMS와는 달리 테이블 간 관계를 정의하지 않습니다.
관계 정의가 없으니 Join이 불가능하고 트랜잭션을 지원하지 않습니다.
NoSQL은 점점 빅데이터의 등장으로 인해 데이터와 트래픽이 기하급수적으로 증가함에 따라 RDBMS에 단점인 성능을 향상하기 위해서는 장비가 좋아야 하는 Scale-Up의 특징이 비용을 기하급수적으로 증가시키기 때문에 데이터 일관성은 포기하되 비용을 고려하여 여러 대의 데이터에 분산하여 저장하는 Scale-Out을 목표로 등장하였습니다.
RDB는 Transaction과 정합성에 초점이 맞춰진 데이터베이스라면 NoSQL은 RDB 보다는 고속의 읽기와 쓰기가 가능하고 분산처리에 뛰어다는 점이 특징입니다.
사전 지식
Scale-Up : cpu 변경 램 추가 등 하드웨어를 변경하여 시스템의 성능을 높임
=> rdbms에서 사용하는 성능 개선 방식 (비용이 많이 발생)
Scale-Out : 하나의 장비에서 처리하던 일을 여러 장비에 나눠서 처리함
=> 비교적 저렴한 방식으로 서버 유지 가능
파티션의 사전적 의미는 칸막이 분할입니다.
실생활 넓은 사무실 공간을 부서나 팀 단위로 적당히 나누어 사용하는 것처럼 데이터 베이스에서 테이블과 인덱스를 분할하여 저장하는 개념입니다.
데이터가 일정 규모를 넘어서면 인덱스 조정이나 쿼리 변경만으로는 한계가 있습니다.
적절한 인덱스가 생성되었다고 해도 랜덤 액세스의 양이 방대해지기 때문에 오히려 테이블 풀스캔이 나을 수도 있고 이러한 탐색은 상당히 비효율적이고 시간도 오래 걸립니다.
이럴 때 파티션 개념을 적용하게 된다면 쿼리를 튜닝하지 않고도 성능을 끌어올릴 수 있습니다.
그래서 파티셔닝 개념은 대용량 데이터가 분포된 테이블에 적절하게 사용하면 큰 효과를 볼 수 있습니다.
파티셔닝에는 대표적으로 4가지의 파티셔닝 방법이 있습니다.
첫 번째로 range partitioning 즉 범위 파티셔닝이 있는데 데이터 내의 특정 범위 내역을 정하여 파티셔닝 해주는 방법으로 사용하기 쉽다는 장점이 있으나, 데이터가 균일하게 분포되지 못해서 성능 저하가 생길 수 있다는 단점이 존재합니다.
두 번째로 hash partitioning 즉 해시 파티셔닝이 있습니다.
range 파티션에서 범위 분포에 대한 단점을 보완한 것으로 hash 함수가 데이터를 균등하게 분포시켜 성능 하락을 방지합니다.
하지만, 데이터의 관리가 어렵다는 단점이 존재합니다.
세 번째는 list partitioning 방법이 있는데 파티셔닝 할 항목을 관리자가 직접 지정하는 방식으로 잘 설정한 결우에는 빠른 성능이 보장되지만, 잘못 설정된 경우에는 성능 저하가 발생할 수 있습니다.
마지막으로 conposite partitioning 이 존재합니다.
이름 그대로 복합 파티션으로 위의 파티셔닝을 복합적으로 사용하는 것입니다.
트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻합니다.
또한 트랜잭션은 4가지의 성질을 가지고 있습니다.
트랜잭션은 모두 완료되거나 하나도 완료되지 않아야 합니다.
트랜잭션의 작업 처리 결과는 항상 일관성을 유지해야 합니다.
하나의 트랜잭션이 작동하고 있을 때 다른 트랜잭션이 해당 트랜잭션의 연산에 끼어들 수 없습니다.
트랜잭션이 완료된 후의 데이터는 영구적으로 보존되어야 합니다.
인덱스는 데이터베이스에서 테이블의 검색 성능을 높여주는 방법입니다.
관계형 데이터베이스에서는 B+Tree구조로 된 index를 사용하여 검색 속도를 향상시킵니다.
특히 select ~ where 쿼리처럼 특정 데이터를 찾을 때 빠른 속도로 검색할 수 있게 해 줍니다.
인덱스는 Btree, B+tree(대부분), Hash, Bitmap로 구현할 수 있습니다.
인덱스를 생성하면 특정 컬럼(속성)의 값을 기준으로 정렬하여 데이터의 물리적 위치 주소와 함께 별도 파일에 저장합니다.
이때 특정 컬럼을 'search-key'라고 하고 실제 데이터의 물리적 위치 값을 'pointer'라고 합니다.
보통 인덱스는 테이블 크기의 10% 정도의 저장 공간을 차지합니다.
테이블의 데이터는 순서 없이 쌓이게 되므로 특정 조건의 데이터를 찾으려면 테이블의 모든 데이터에 접근하여 비교하는 과정이 필요합니다.(full table scan) 하지만 인덱스가 있는 경우 search-key가 정렬되어 있기 때문에 조건 검색 시 속도가 빠릅니다.
만약 대량의 데이터를 가지고 있고 select ~ where 같은 특정 조건의 데이터를 찾을 때, 인덱스를 활용하여 빠르게 데이터를 가져올 수 있습니다. 반대로 데이터의 양이 많지 않다면 굳이 인덱스를 사용할 이유가 없어집니다.
인덱스의 장점은 빠른 검색 속도 향상입니다.
인덱스의 단점은 추가 저장공간이 필요하다는 점입니다.(약 10%)
그리고 insert, update, delete 등의 변동 사항이 있는 경우 성능이 저하됩니다.
왜냐하면 데이터 변경 시 인덱스도 수정되어 추가 비용이 발생하기 때문입니다.
[참고링크]