Q) 인덱스란 무엇인가요?
A) 인덱스는 데이터베이스에서 검색 속도를 높이기 위해 활용합니다. 쿼리의 부하가 줄어들어 시스템의 성능이 향상될 수 있지만 단점도 존재합니다. 잘못 사용하는 경우 오히려 성능이 나빠질 수도 있습니다.
Q) 인덱스의 종류에는 무엇이 있나요?
A) 인덱스는 크게 두가지로 나뉘는데, 클러스터형 인덱스와 보조 인덱스입니다. 각각을 영어사전과 책뒤의 찾아보기에 비유할 수 있습니다.
클러스터형 인덱스(clustered index)는 영어 사전과 같이 책 내용 자체가 순서대로 정렬이 되어 있어 해당 인덱스 자체가 책의 내용과 같습니다. 클러스터형 인덱스는 테이블 당 한개만 생성 가능합니다. 클러스터형 인덱스는 행 데이터를 인덱스에 맞춰 자동 정렬합니다.
보조 인덱스(secondary index)는 <찾아보기>를 찾은 후 해당 페이지로 가야 원하는 데이터를 얻을 수 있습니다. 보조 인덱스는 테이블 당 여러개 생성할 수 있습니다.
Q) 인덱스는 어떻게 생성할 수 있나요?
A) 테이블 생성 시에 제약 조건에 Primary Key 또는 Unique를 사용하면 인덱스가 자동생성됩니다. 열에 Primary Key를 지정하면 해당 열에 클러스터형 인덱스가 생성됩니다. 여러 열에 Primary Key와 Unique를 각각 지정하면 Unique로 지정된 열에는 보조 인덱스가 생성됩니다. Primary Key 없이 Unique만 지정하면 모두 보조 인덱스로 지정됩니다. 클러스터형 인덱스가 비었다고 UNIQUE가 클러스터형 인덱스가 되는 것은 아닙니다. UNIQUE에 NOT NULL이 포함되면 클러스터형인덱스로 지정됩니다. 만약 PRIMARY KEY와 UNIQUE NOT NULL이 함께 있다면 우선 순위가 높은 PRIMARY KEY에 클러스터형 인덱스가 지정됩니다.
Q) 인덱스의 자료구조를 설명해주세요.
A) 인덱스는 기본적으로 B-Tree를 이용하여 구현합니다. 리프노드로 부터 자식 노드로 이동해가며 데이터를 탐색하면 모든 데이터를 풀스캔하지 않고도 원하는 데이터를 찾아낼 수 있습니다. 이러한 B-Tree 구조는 SELECT와 같은 구문을 사용할때 매우 뛰어난 성능을 보여줍니다.
+) 해시테이블은 인덱스 자료구조로 적합하지 않습니다. 해시테이블은 값을 변형하여 저장하기 때문에 특정 문자로 시작하는 값을 검색할 경우 해시테이블로는 검색을 할 수 없게 됩니다. 또한 셀렉트 연산에는 부등호와 같은 연산도 포함되기 때문에 이러한 연산에 해시테이블은 적합하지 않습니다.
Q) 클러스터형 인덱스의 내부 구조와 보조 인덱스의 내부 구조는 어떻게 다른가요?
A) 클러스터형 인덱스를 생성하게 되면 데이터 페이지 전체가 정렬이 됩니다. 그리고 B-Tree 형태의 인덱스 페이지가 형성됩니다. 이때 인덱스 페이지의 리프 페이지는 데이터 페이지 자체가 됩니다. 보조 인덱스의 경우에는 데이터 페이지를 건드리지 않고 별도로 인덱스 페이지를 생성합니다. 인덱스 페이지의 리프 페이지에 인덱스로 구성한 열을 정렬하고 데이터 위치를 가리키는 포인터를 생성합니다.
클러스터형 인덱스는 보조 인덱스보다 검색 속도는 빠르지만 데이터의 입력/수정/삭제는 더 느립니다.
Q) 인덱스로 인해 성능이 저하되는 경우는 어떤 경우인가요?
A) INSERT, UPDATE, DELETE와 같은 데이터의 변경 작업(DML) 시에 성능이 저하될 수 있습니다.
INSERT의 경우 페이지에 데이터가 들어갈 공간이 없을 시 새로운 페이지를 만들고 키를 옮기는 '페이지 분할' 작업이 발생합니다.
DELETE의 경우는 데이터가 지워지지 않고 사용안됨 표시만 해둡니다. 즉 row의 수가 변하지 않습니다. 이런 작업이 반복되면 실제 데이터에 비해 데이터베이스 row 크기는 몇배로 늘어날 수 있다.
UPDATE의 경우 INSERT와 DELETE의 문제를 동시에 가집니다.
Q) 언제 인덱스를 생성하는 것이 좋은가요?
A) 인덱스는 WHERE절에서 사용되는 열에 만드는 것이 좋습니다. WHERE절에 사용되더라도 자주 사용해야 가치가 있습니다. 그리고 조인에 자주 사용되는 열에 인덱스를 만드는 것이 좋습니다. 그리고 데이터의 중복도가 높은 열에는 인덱스를 만들어도 큰 효과가 없습니다. 또 INSERT, UPDATE, DELETE가 얼마나 자주 일어나는 지도 고려해야 합니다. 인덱스에서 데이터 변경 작업은 오히려 부담을 주기 때문입니다.
Q) 조인의 종류에 대해 설명해주세요.
A) 조인이란 두개 이상의 테이블이나 DB를 연결하여 데이터를 검색하는 방법입니다. 테이블 연결을 위해선 적어도 하나의 열을 공유하고 있어야 하기 때문에 이를 이용하여 조인이 이루어집니다.
INNER JOIN은 양쪽테이블에 모두 내용이 있는 것만 조인되는 방식입니다.
LEFT OUTER JOIN은 왼쪽 테이블의 것은 모두 출력되도록 조인되는 방식입니다. = RIGHT OUTER JOIN
FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN이 합쳐진 것으로 생각하면 됩니다. FULL JOIN이라고도 부르며 양쪽 모두에 조건이 일치하지 않는 것을 모두 출력하는 방식입니다.
CROSS JOIN은 모든 경우의 수를 전부 출력해주는 방식입니다.
Q) SQL과 NoSQL은 무슨 차이가 있나요?
A) NoSQL은 대량의 비정형 데이터를 저장하고 처리하기 위해 특화된 데이터베이스이며, 스키마 없이 사용 가능하기때문에 데이터 구조를 미리 정의할 필요가 없습니다. 또한 수시로 그 구조를 바꿀 수 있습니다. SNS와 같이 빠르게 양산되는 이미지, 텍스트데이터, 또는 CCTV를 통해 촬영되는 영상들 같이 빠른 속도로 엄청난 양이 생성되지만 수정보다는 삽입 위주의 데이터를 저장하고 관리하는 용도에는 NoSQL이 더 적합합니다.
Key-Value 모델은 가장 단순한 형태의 NoSQL로, 하나의 키에 하나의 값을 저장할 수 있는 구조입니다.
Document 모델은 키-값 모델을 확장한 형태로, 키 하나에 구조화된 문서를 저장할 수 있습니다.
Column 모델은 하나의 키에 여러개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장합니다.
+) Key-Value Model : 다이나모DB(DynamoDB), 레디스(Redis) 등
Doucment Model : 몽고DB(MongoDB), 카우치DB(CouchDB) 등
Column Model : 구글 빅테이블(BigTable), H베이스(HBase), 카산드라(Cassandra) 등
+) NoSQL의 CAP이론
일관성(consistency)- 다중 클라이언트에서 같은 시간에 조회하는 데이터는 항상 동일한 데이터여야 함
가용성(availbility) - 모든 클라이언트의 읽기/쓰기 요청에 대해 항상 응답이 가능해야 함
네트워크 분할 허용성(partition tolerance) - 지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 두 지역간 네트워크가 단절되거나 네트워크 데이터 유실이 일어나더라도 각 지역내 시스템은 정상적으로 동작해야 함
Tech Interview/Database
[데이터베이스] 인덱스, 조인, NoSQL
반응형
댓글