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)이 자주 일어나는 속성