1. SQL & NoSQL

* SQL (관계형 데이터베이스)

sql을 사용하면 RDBMS(관계형 DB)에서 데이터를 CRUD할 수 있다.

관계형 DB 특징
  • 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
  • 데이터는 관계를 통해 여러 테이블에 분산된다.

데이터는 테이블(table)에서 명확하게 정의한 구조의 레코드(record) 형태로 저장된다. 해당 구조는 필드의 이름과 데이터 유형으로 정의된다.

-> 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. (정해진 구조에 맞는 레코드만 추가가 가능함!)

관계를 이용해서 데이터들을 여러개의 테이블에 나누어서 데이터들의 중복을 피할 수 있다. 다른 테이블에서 부정확한 데이터를 다룰 위험이 없다.

* NoSQL (비관계형 데이터베이스)

관계형 DB와 다르게 정해진 스키마와 관계가 없다.

NoSQL에서는 레코드를 문서(documents)라고 부른다. 다른 구조의 데이터를 같은 컬렉션(SQL에서는 테이블)에 추가할 수 있다.

  • 문서(documents)는 스키마를 신경쓸 필요가 없으며 JSON 데이터와 비슷한 형태를 가지고 있다.
  • 조인(join)이라는 개념이 존재하지 않고, 여러 콜렉션에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서(documents)를 작성한다. -> 데이터가 중복되기 때문에 불안정할 수 있지만, 복잡하고 느릴 수 있는 조인을 사용할 필요가 없는 것이 장점이다.

* SQL vs NoSQL

SQL의 장점

  • 명확한 스키마, 데이터 무결성 보장!
  • 관계를 통한 중복없는 데이터

NoSQL의 장점

  • 정해진 스키마가 없어 유연하고, 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있다.
  • 데이터가 어플리케이션이 요구하는 형식으로 저장될 수 있으므로, 읽어오는 속도가 빨라진다.
  • 수직 및 수평확장이 가능하다.

SQL의 단점

  • 데이터 스키마를 사전에 설계해야해서 상대적으로 덜 유연하다.
  • 관계성을 이용하기 때문에 조인이 많은 매우 복잡한 쿼리가 만들어질 수 있다.
  • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하다.

NoSQL의 단점

  • 너무 높은 유연성 때문에, 데이터 구조 결정을 하지 못할 수 있다.
  • 데이터가 여러 컬렉션에 중복되어 있을 수 있어, 수정이 필요한 경우 모든 컬렉션에서 수행해야한다.

* SQL 사용 권장의 경우

  • 관계를 맺고 있는 데이터가 자주 변경되는 경우
  • 명확한 스키마가 사용자와 데이터에 있어 중요한 경우

* NoSQL 사용 권장의 경우

  • 정확한 데이터 구조를 알 수 없거나 변경/확장될 수 있는 경우
  • DB를 수평으로 확장해야 하는 경우
  • 읽기처리를 자주하지만, 데이터를 자주 변경하지 않는 경우

2. 인덱스(Index)

RDBMS에서 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색속도를 향상시키기 위한 자료구조이다.

테이블의 속성(Column)을 색인화한다.

-> 테이블의 레코드를 Full Scan 하지 않는다.

-> 색인화 된 인덱스 파일 검색으로 검색 속도가 향상된다.

DB에서 테이블을 생성하면, MYD, MYI, FRM 3개의 파일이 생성된다.

  • FRM : 테이블 구조가 저장되어 있는 파일
  • MYD : 실제 데이터가 있는 파일
  • MYI : 인덱스 정보가 들어가 있는 파일

사용자가 조회 쿼리로 Index를 사용하는 Column을 탐색 시, MYI 파일의 내용을 검색한다.

* 인덱스 장단점

장점

  • 테이블을 조회하는 속도와 그에 따른 성능을 향상
  • 전반적인 시스템의 부하를 줄일 수 있다.

단점

  • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요
  • 인덱스를 관리하기 위해 추가 작업이 필요하다.
  • 인덱스를 잘못 사용하면 오히려 성능이 저하될 수 있다. (인덱스된 필드에서 데이터를 업데이트하거나 레코드를 추가 또는 삭제하는 경우, 데이터 변경 작업이 자주 일어나는 경우)

* 인덱스를 사용하면 좋은 경우

  • Where 절에서 자주 사용되는 속성
  • 조인에서 자주 사용되는 속성
  • 외래키가 사용되는 속성

* 인덱스 사용을 피해야 하는 경우

  • 데이터 중복도가 높은 속성
  • DML(Insert, Update, Delete)이 자주 일어나는 속성