냥코딩쟝
  1. 관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)의 장단점 비교

 

 

  • 관게형 데이터베이스는.......

관계형 데이터베이스

관계형 데이터베이스란 테이블(table)로 이루어져 있으며, 이 테이블은 키(key)와 값(value)의 관계를 나타낸다.테이블은 이름을 가지고 있으며, 행(row)과 열(column) 그리고 거기에 대응하는 값을 가진다. 즉 관계형 데이터베이스는 위와 같이 구성된 테이블이 다른 테이블들과 관계를 맺고 모여있는 집합체로 이해할 수 있습니다.

 

  1. 트랜잭션(transaction)이란 무엇인가요?

트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.

 

트랜잭션은 작업의 완전성을 보장해준다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.

 

 

 

 

 

  • 트랜잭션이란...............
  • Atomicity(원자성)
    • 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영 되지 않아야 한다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
  • Consistency(일관성)
    • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
    • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 수행 완료 후의 상태가 같아야 한다.
  • Isolation(독립성)
    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들수 없다.
    • 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조 할 수 없다.
  • Durability(지속성)
    • 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다.

 

  1. MySQL에서 조인(join)의 역할은 무엇인가요? 다양한 join의 방식에 대해 설명해주세요.

Join(조인)또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것

따라서 조인은 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어 낸다.

 

 

 

  • 조인이란...........

내부 조인(inner join)

  • 조인하는 테이블에서 조인 칼럼의 값이 같은 건을 조회하는 방법
  • INNER 생략 가능
SELECT ...
  FROM 테이블1 [AS] 별칭1 # 테이블1 -> 조인에 참여할 첫 번째 테이블(주요 테이블)
[INNER] JOIN 테이블2 [AS] 별칭2 # 테이블2 -> 조인에 참여할 두 번째 테이블
    ON 별칭1.칼럼1 = 별칭2.칼럼2 # ON 다음에는 조인 조건을 기술함
   AND ... # 조인 조건이 2개 이상이면 AND 연산자로 필요한 만큼 추가 가능
 WHERE ... ; # 조인 조건이 아닌 다른 조건



외부 조인(outer join)

  • 조인 칼럼의 값이 같은 건을 조회하면서 한쪽 테이블에 조인 칼럼의 값이
    같지 않은 건이 있으면 이 건까지 함께 조회

LEFT 조인

  • LEFT JOIN을 기준으로 왼쪽 테이블에서 조인 조건을 만족하지 않는 건을
    추가로 조회
  • OUTER 생략 가능
SELECT ...
  FROM 테이블1 [AS] 별칭1
  LEFT [OUTER] JOIN 테이블2 [AS] 별칭2
    ON 별칭1.칼럼1 = 별칭2.칼럼2
   AND ...
 WHERE ... ;

RIGHT 조인

  • RIGHT JOIN을 기준으로 오른쪽 테이블에서 조인 조건을 만족하지 않는 건을
    추가로 조회
  • OUTER 생략 가능
SELECT ...
  FROM 테이블1 [AS] 별칭1
 RIGHT [OUTER] JOIN 테이블2 [AS] 별칭2
    ON 별칭1.칼럼1 = 별칭2.칼럼2
   AND ...
 WHERE ... ;



자연 조인(natural join)

  • 조인 조건을 기술하지 않는다.
  • 조인에 참여하는 두 테이블의 조인 칼럼명과 데이터 타입이 같아야 한다.
  • NATURAL만 있거나 NATURAL INNER를 기술하면
    자연 조인 구문을 사용한 내부 조인을 의미
  • NATURAL LEFT 또는 NATURAL RIGHT를 사용하면
    자연 조인 구문을 사용한 외부 조인을 의미
SELECT ...
  FROM 테이블1 [AS] 별칭1
NATURAL [INNER|{LEFT|RIGHT} [OUTER]] JOIN 테이블2 [AS] 별칭2
 WHERE ... ;

 

 

  1. MySQL에서 인덱스(index)란 무엇인가요?

인덱스란 데이터의 저장(INSERT, UPDATE, DELETE) 의 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높이는 테이블의 동작속도(조회)를 높여주는 자료구조이다. 

 

 

 

클러스터 인덱스 (Primary Index)

  • 특정 나열된 데이터들을 일정 기준으로 정렬해주는 인덱스다. (ex : 영어사전)
    그래서 클러스터형 인덱스 생성 시에는 데이터 페이지 전체가 다시 정렬된다.
  • 하지만 이러한 정렬 특징 때문에, 이미 대용량의 데이터가 입력된 상태라면 클러스터형 인덱스 생성은 심각한 시스템 부하를 줄 수 있다.
  • 한개의 테이블에 한개씩만 만들 수 있다 (ex : Primary Key)
  • 본래 인덱스는 생성 시 데이터들의 배열정보를 따로 저장하는 공간을 사용하나, 클러스터 인덱스는 따로 저장하는 정보 공간을 적게 사용하면서 테이블 공간 자체를 활용한다.
    인덱스 자체의 리프 페이지가 곧 데이터이기 때문에 인덱스 자체에 데이터가 포함되어있다고 볼 수 있다.
  • 보조 인덱스 보다 검색 속도는 더 빠르다.
    하지만 입력/수정/삭제는 더 느리다.
  • MySQL에서는 Primary Key가 있다면 Primary Key를 Clustered INDEX로, 없다면 UNIQUE 하면서 NOT NULL인 컬럼을, 그것도 없으면 임의로 보이지않는 컬럼을 만들어 Clustered Index로 지정한다.

 

클러스터 인덱스 생성시 페이지 변화

  • 인덱싱을 하면 루트 페이지라는 것이 만들어진다.
    루트 페이지는 각 데이터 페이지의 첫번째 데이터만 따와서 모아 매핑시키는 페이지이다.
  • 그리고 데이터 페이지는 자동 정렬이 된다.
  • 데이터 페이지 자체를 인덱스 페이지로 하는 특징이 있다.

 

 

 

 

  • 인덱스란............

 

MySQL 에서 인덱스는 특정 컬럼 값에 대한 색인(목차) 입니다. 두꺼운 책 가장 앞에 목차를 표기해 두어 독자들이 빠르게 원하는 목차로 찾아갈 수 있도록 하는데 이와 비슷한 개념이 MySQL 의 INDEX 입니다.

 

테이블의 검색속도는 데이터가 몇개 없으면 상관이 없지만, 데이터가 방대해질수록 속도면이 현저히 떨어지게 됩니다. 이때 미리 데이터들에 목차가 되는 형태의 index 를 설정해두면 검색 속도를 향상시킬 수 있습니다.

 

예를들어 사용자가 100만명이 있는 테이블에서 userId 가 akdu39zkauebglska 라는 값을 찾고자 한다면, 다음이 쿼리를 사용해야 합니다.

 

 

답변은 깃헙 레포에,,

https://github.com/nanandive/wanted-pre-onboarding-challenge-be-task-February/blob/main/answer.md

 

GitHub - nanandive/wanted-pre-onboarding-challenge-be-task-February: [사전 과제] 원티드 백엔드 프리 온보딩 백엔

[사전 과제] 원티드 백엔드 프리 온보딩 백엔드 챌린지 2월. Contribute to nanandive/wanted-pre-onboarding-challenge-be-task-February development by creating an account on GitHub.

github.com

 

 

profile

냥코딩쟝

@yejang

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!