본문 바로가기

외부 활동/JSCODE 데이터베이스 면접

3주차 면접 예상 질문

랜덤 I/O와 순차 I/O에 대해서 설명해주세요.

랜덤 I/O는 데이터를 메모리 내에서 임의의 위치에서 읽거나 쓰는 것을 의미합니다.

 예를 들어, 특정 레코드를 찾거나 수정할 때 데이터의 위치를 미리 알 수 없는 경우에 랜덤 I/O가 사용됩니다. 

반면에 순차 I/O는 데이터를 연속된 순서대로 읽거나 쓰는 것으로, 

파일이나 기타 데이터 저장 매체에서 처음부터 끝까지 차례로 접근하는 방식을 나타냅니다. 

이러한 입출력 방식은 주로 데이터의 연속성을 활용하는 경우에 적용되며, 

대표적으로 일련의 레코드를 처리하거나 파일을 순차적으로 탐색할 때 사용됩니다.

 

 

인덱스에 대해서 설명해주세요.

인덱스는 데이터베이스나 다른 데이터 저장 체계에서 검색 성능을 향상시키기 위해 사용되는 특별한 데이터 구조입니다. 

인덱스는 테이블의 열에 대한 정렬된 값 목록으로, 이를 통해 빠른 데이터 검색이 가능해집니다. 

이는 특히 대량의 데이터에서 원하는 행을 빠르게 찾을 수 있게 도와주며, 검색 속도를 향상시키는데 기여합니다. 

그러나 인덱스는 쓰기 작업 시에 성능 저하를 일으킬 수 있으므로 신중한 설계와 관리가 필요합니다. 

인덱스는 데이터베이스 쿼리의 성능을 최적화하고 데이터 접근을 가속화하는데 핵심적인 역할을 합니다.

 

 

인덱스의 동작 방식에 대해서 설명해주세요.

인덱스는 데이터베이스에서 빠른 검색을 가능하게 하는 특별한 데이터 구조로, 

테이블의 특정 열에 대한 정렬된 키와 해당 키가 위치한 행의 주소를 저장합니다. 

이로써 데이터베이스 시스템은 검색 연산을 효율적으로 수행할 수 있습니다. 

예를 들어, 특정 값을 검색할 때 전체 테이블을 순차적으로 검색하는 것이 아니라 인덱스를 통해 해당 값을 빠르게 찾을 수 있습니다. 

인덱스는 이진 검색이나 B-트리와 같은 알고리즘을 사용하여 빠른 검색을 지원하며, 데이터의 정렬된 형태로 인해 검색 속도가 향상됩니다.

 그러나 인덱스는 쓰기 작업 시에 오버헤드가 발생할 수 있으므로 적절한 상황에서의 사용과 유지보수가 필요합니다.

 

 

 

 

어떤 기준으로 인덱스를 설정해야할까요?

인덱스를 설정하는 기준은 주로 쿼리의 성능을 향상시키고 데이터베이스 작업을 최적화하는 데에 중점을 둬야 합니다. 

먼저, 테이블에서 자주 사용되는 검색 조건이나 WHERE 절에 포함된 열들을 고려해야 합니다. 

그 열들을 기준으로 인덱스를 생성하면 해당 조건에 대한 검색이 빨라집니다. 

또한, 데이터의 카디널리티(고유한 값의 수)가 높은 열일수록 인덱스의 효과가 더 커집니다. 

그러나 인덱스를 너무 많이 생성하면 쓰기 작업의 성능에 영향을 미칠 수 있으므로 신중한 선택이 필요합니다. 

종종 튜닝 도구를 사용하여 쿼리 실행 계획을 분석하고 어떤 인덱스가 필요한지를 결정하는 것이 도움이 됩니다

 

 

 

테이블에 인덱스를 많이 설정하면 좋을까요?

테이블에 많은 인덱스를 설정하는 것은 쿼리 성능을 향상시킬 수 있지만, 

쓰기 작업의 성능에 부정적인 영향을 미칠 수 있으므로 신중한 평가와 최적화가 필요합니다

 

 

 

커버링 인덱스(Covering index)에 대해서 설명해주세요.

커버링 인덱스는 쿼리가 필요로 하는 모든 컬럼 데이터를 인덱스 자체에서만 가져오는 특별한 형태의 인덱스입니다. 

이는 디스크에서 테이블 데이터에 대한 추가적인 읽기 작업 없이도 인덱스만을 이용해 쿼리 결과를 생성할 수 있게 해줍니다. 

따라서 쿼리의 실행 속도를 향상시키고 I/O 비용을 줄이는 데에 기여하며, 특히 선택적인 컬럼들을 포함하는 쿼리에서 효과적입니다. 

그러나 커버링 인덱스를 생성할 때는 필요한 컬럼을 고려하여 신중하게 설계해야 하며, 모든 쿼리에 적합한 경우가 아닐 수 있습니다.

 

 

 

다중 컬럼 인덱스(Multi-column index, 복합 인덱스)에 대해서 설명해주세요.

멀티-컬럼 인덱스 또는 컴파운드 인덱스는 두 개 이상의 열을 포함하는 인덱스로, 

이는 여러 열의 조합에 대한 검색 및 정렬을 효과적으로 지원합니다. 

이러한 인덱스를 사용하면 특정 쿼리에서 여러 열을 기반으로 데이터를 검색하거나 정렬하는 경우에 성능이 향상될 수 있습니다. 

그러나 멀티-컬럼 인덱스를 생성할 때는 신중한 설계가 필요하며, 어떤 열의 순서로 인덱스를 구성할지 결정해야 합니다. 

검색 조건이나 정렬에 따라 적절한 멀티-컬럼 인덱스를 선택하여 데이터베이스 성능을 최적화할 수 있습니다.

 

 

 

B-Tree 인덱스와 B+Tree 인덱스에 대해 설명해주세요.

B-Tree 인덱스와 B+Tree 인덱스는 데이터베이스에서 효율적인 검색을 위한 트리 기반의 데이터 구조입니다.

B-Tree는 각 노드가 키와 해당 키에 대한 데이터의 주소를 가지며, 검색, 삽입, 삭제 연산에 효율적입니다.

B+Tree는 B-Tree의 변형으로, 리프 노드가 연결 리스트로 구성돼 있어 범위 검색에 유리하며,

인덱스의 효율적인 범위 스캔을 지원합니다. 둘 다 트리의 균형을 유지하면서 검색 연산에 O(log n)의 시간 복잡도를 제공하며,

데이터베이스에서 인덱스로 사용되어 빠른 검색 및 정렬을 가능하게 합니다.

B+Tree는 대부분의 현대 데이터베이스 시스템에서 많이 사용되며, 범위 쿼리와 정렬에 뛰어난 성능을 보장합니다.

 

 

 

 

Hash 인덱스에 대해서 설명해주세요.

해시 인덱스는 데이터를 해시 함수에 의해 생성된 해시값을 기반으로 인덱싱하는 방식으로 동작합니다. 

이 해시값은 특정 데이터를 찾기 위한 주소 역할을 하며, 이를 통해 빠른 검색 성능을 제공합니다. 

해시 인덱스는 일반적으로 등호 연산자(=)와 같은 정확한 일치 검색에 특히 효과적이며, 검색 시간이 상수에 가깝게 유지됩니다. 

그러나 범위 검색이나 정렬에는 적합하지 않을 수 있으며, 충돌이 발생할 경우 처리하는 방법이 필요합니다. 

일반적으로 해시 인덱스는 메모리 내에서 빠르게 검색이 가능한 경우에 효과적으로 사용됩니다.

 

 

 

클러스터링 인덱스에 대해서 설명해주세요.

 

클러스터링 인덱스는 데이터베이스에서 특정 열의 값을 기준으로 테이블의 실제 데이터를 정렬하는 인덱스 형태입니다. 

이는 클러스터링된 열의 값에 따라 테이블 내의 행이 물리적으로 정렬되어 저장되기 때문에 해당 열을 기준으로 

한 검색 및 범위 쿼리에서 빠른 성능을 제공합니다.

 클러스터링 인덱스를 사용하면 해당 인덱스의 키 순서대로 데이터가 저장되기 때문에 범위 쿼리나 정렬이 효율적으로 처리됩니다.

 그러나 이로 인해 삽입, 삭제, 업데이트 작업이 복잡해질 수 있으며, 주의해서 선택하여 사용해야 합니다.

 

 

인덱스 스캔 방식에 대해서 설명해주세요.

인덱스 스캔은 데이터베이스에서 인덱스를 활용하여 검색 작업을 수행하는 방법 중 하나입니다. 

인덱스 스캔은 특정 검색 조건에 맞는 데이터를 찾기 위해 인덱스를 순회하는 과정을 의미합니다. 두 가지 주요 유형이 있습니다. 

첫 번째는 범위 스캔으로, 인덱스의 일부 범위를 검색하는 방식으로 주로 범위 쿼리에 유용합니다. 

두 번째는 전체 스캔 또는 인덱스 풀 스캔으로, 인덱스 전체를 순회하여 모든 데이터를 가져오는 방식입니다. 

이 방법은 작은 테이블이나 특정 조건에 부합하는 대부분의 행을 반환하는 경우에 효과적일 수 있습니다. 

인덱스 스캔은 데이터베이스 성능을 향상시키는 데 중요한 역할을 하며, 올바른 인덱스를 선택하고 쿼리를 튜닝하는 것이 중요합니다.

 

 

쿼리 실행 계획에 대해서 설명해주세요. 실행 계획을 확인해본적이 있나요?

 

쿼리 실행 계획은 데이터베이스 관리 시스템이 주어진 쿼리를 처리하는 방법을 나타내는 로드맵으로, 

쿼리 옵티마이저가 결정한 작업의 순서와 방법을 표현합니다. 

이 계획은 쿼리를 효율적으로 실행하기 위해 테이블 및 인덱스 액세스, 조인, 필터링 등 다양한 단계로 구성됩니다. 

쿼리 실행 계획을 이해하면 데이터베이스 엔진이 쿼리를 어떻게 처리하고 최적화하는지 파악할 수 있으며, 

성능 튜닝이나 인덱스 디자인을 위한 중요한 정보를 제공합니다. 

계획을 분석하여 쿼리의 성능을 최적화하고 효과적인 데이터 액세스를 구성하는 데 도움이 됩니다.

 

 

 

 

힌트에 대해서 설명해주세요.

 

힌트는 데이터베이스 쿼리에서 옵티마이저에게 쿼리 실행 계획을 조작하거나 변경할 지시를 제공하는 주석 형태의 명령어입니다. 

이는 쿼리 옵티마이저가 자동으로 최적의 실행 계획을 선택하는 대신, 명시적으로 사용자가 원하는 실행 계획을 지정할 때 사용됩니다. 

예를 들어, 인덱스를 강제로 사용하도록 하는 힌트를 추가하여 성능을 최적화하거나, 

특정 테이블을 조인 순서에 따라 지정하는 등의 용도로 힌트가 활용될 수 있습니다. 

그러나 힌트는 주로 성능 최적화가 필요한 특정 상황에서만 사용되어야 하며, 사용 시에는 주의해서 적용해야 합니다.

 

 

인덱스가 잘 동작하고 있는지 어떻게 확인할 수 있을까요?

 

인덱스가 효과적으로 작동하는지 확인하려면 몇 가지 접근 방법을 사용할 수 있습니다. 

먼저, 데이터베이스 관리 시스템이 제공하는 성능 모니터링 도구를 사용하여 인덱스 관련 통계와 성능을 확인할 수 있습니다. 

이를 통해 인덱스 스캔 및 인덱스 히트율 등을 살펴보면 어떤 인덱스가 자주 사용되고 있는지 확인할 수 있습니다. 

또한, 쿼리 실행 계획을 분석하여 인덱스를 사용하고 있는지 여부를 확인할 수 있습니다. 

인덱스가 효과적으로 활용되면 쿼리 최적화를 위해 인덱스 스캔이나 인덱스 탐색이 발생할 것입니다. 

마지막으로, 실제로 특정 쿼리의 성능을 측정하여 인덱스를 사용하고 있는지, 

그리고 해당 인덱스의 성능이 어떤지를 평가할 수 있습니다. 

이러한 방법을 통해 데이터베이스의 인덱스가 잘 작동하는지를 평가할 수 있습니다.

 

 

 

인덱스 사용시 주의해야할 점에 대해서 알려주세요.

인덱스를 사용할 때 주의해야 할 점은 몇 가지가 있습니다. 

먼저, 너무 많은 인덱스를 생성하는 것은 쿼리의 성능을 향상시킬 수 있지만, 쓰기 작업의 성능에 부정적인 영향을 미칠 수 있습니다. 

따라서 필요한 인덱스를 신중하게 선택하고 유지하는 것이 중요합니다. 

또한, 인덱스의 업데이트나 삭제 작업이 빈번하게 발생하는 경우에는 이러한 작업에 따른 오버헤드를 고려해야 합니다. 

불필요한 인덱스를 생성하지 않고, 특정 쿼리의 패턴과 요구사항을 고려하여 최적의 인덱스를 선택하는 것이 성능 향상에 도움이 됩니다.

또한 주기적으로 인덱스를 재조정하거나 최적화하는 것도 중요합니다.

종합적으로, 인덱스 사용은 신중하게 계획되고 유지보수되어야 하며, 데이터베이스의 특정 요건과 작업 패턴을 고려하는 것이 필요합니다.

 

 

 

 

GROUP BY 사용시 인덱스가 걸리는 조건에 대해 설명해주세요.

 

GROUP BY를 사용할 때 인덱스를 고려할 때 몇 가지 조건이 있습니다. 

먼저, GROUP BY 절에 지정된 열은 인덱스로 선정하는데 유용하며, 

해당 열을 기반으로 그룹핑되는 쿼리에서 성능을 향상시킬 수 있습니다. 

또한, 그룹핑되는 열이 정렬된 경우 인덱스의 효과가 더 커집니다. 

그러나 GROUP BY의 대상 열에 대한 인덱스를 생성할 때에도 주의가 필요합니다. 

쿼리에서 필요한 그룹화 작업에 가장 적합한 인덱스를 선택하고,

해당 인덱스가 쿼리에서 어떻게 사용되는지를 주의깊게 고려해야 합니다.

종합적으로, GROUP BY를 사용할 때는 특정 쿼리 패턴과 데이터베이스의 특성에 따라 적절한 인덱스를 선택하는 것이 중요합니다.

 

 

 

이름, 국가, 성별이 있는 테이블에서 인덱스를 어떻게 걸어야할까요?

테이블에 이름(name), 국가(country), 그리고 성별(gender)과 같은 열에 대한 인덱스를 생성하려면, 

데이터베이스 관리 시스템에 따라 다양한 방법이 있습니다. 일반적으로는 다음과 같이 SQL 문을 사용하여 인덱스를 생성할 수 있습니다:

CREATE INDEX idx_name_country_gender ON your_table_name (name, country, gender);


위의 예시에서 your_table_name은 해당 인덱스를 생성하려는 테이블의 실제 이름으로 대체되어야 합니다.

이렇게 생성된 복합 인덱스는 이름, 국가, 성별의 조합에 대한 효과적인 검색을 지원할 수 있습니다.

그러나 특정 쿼리 패턴이나 필요에 따라 단일 열에 대한 인덱스를 추가로 생성하는 것도 고려해야 할 수 있습니다.

인덱스의 생성은 데이터의 패턴과 주로 사용되는 쿼리에 따라 적절한 선택이 필요하므로 주의해서 결정하는 것이 좋습니다.

 

 

 

인성 면접

 

  • 팀 프로젝트에서 주로 어떤 역할을 담당하셨나요?

주로 PM의 역활을 담당한채 백엔드 개발을 위주로 하다가 프론트 엔드의 개발 일정이 딜레이될 경우

프론트 엔드 개발도 같이 참여 했습니다.

 

  • 팀 프로젝트 하면서 의견 충돌이 발생했던 경험에 대해서 설명해주세요.

이전 immsersion 창업동아리 활동을 하던 중 전체적으로 pm분 께서는 다수의 사용자가 사용하는 것을 가정하여 트랜잭션과 과부하 테스트를 진행 하기를 원했습니다.

하지만 트랜잭션과 과부하 테스트를 떠나 기본적인 api들 또한 정확히 정해지지 않았으며 필수 예외처리와 인터셉터 등등 또한 안정화 가 되지 않은 상황에서 특별 상황에 대한 세부 요청하여 의견 충돌이 발생 하였습니다.

 

  • 팀 원들에게 자신은 어떤 팀원으로 생각될 것 같으세요?

의욕이 충만하여 공부를 많이 하지만 아직은 모든걸 모른느 팀원으로 생각 될것 같습니다.

 

  • 본인이랑 잘 안 맞는 팀원이 있다면 어떻게 업무하실건가요?

우선 어떤 것이 안맞는지를 파악해 볼것 같습니다.

일 하는 방식이 안맞는 다면 pm 분에게 말씀 드려 중립적인 합의를 보려고 할것 같습니다.

 

  • 본인의 의견이 팀에서 잘 받아들여지지 않을 경우 어떻게 하실건가요?

더욱 더 명확한 근거와 함께 따로 시간을 내어 pm 분에게 찾아뵈어 설득을 해볼꺼같습니다.

그럼에도 받아들여지지 않을 경우에는 우선 지시대로 프로젝트를 진행 하며 저의 의견이 맞지 않아 딜레이 혹은 

문제가 생겼던 사항들을 메모해두며 다른 근거를 더 자세히 모아서 pm 분에게 찾아가서 건의를 할것 같습니다.

 

 

 

 

 

 

 

 

'외부 활동 > JSCODE 데이터베이스 면접' 카테고리의 다른 글

4주차 면접예상 질문  (0) 2023.11.28
4주차 이상 현상, 정규화  (1) 2023.11.28
3주차 인덱스  (0) 2023.11.20
2주차 면접 예상 질문  (0) 2023.11.14
2주차 : SQL  (1) 2023.11.14