📑
DB 인덱스
: 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터가 정렬되어 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장되는 자료구조. 책의 색인과 같은 역할. 인덱스는 데이터베이스에서 조건 검색과 정렬 작업을 효율적으로 처리하는 데 도움이 됨.
장점
- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
- 전반적인 시스템의 부하를 줄일 수 있다.
단점
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하게 된다.
- 인덱스 관리를 위한 추가 작업이 필요하다.
- 인덱스를 잘못 사용하면 오히려 성능이 저하될 수 있다. ex) 데이터 생성, 삭제, 수정이 빈번한 속성에 인덱스를 거는 경우, 인덱스의 크기가 비대해져 성능이 오히려 저하될 수 있다.
→ update와 delete는 기존의 인덱스를 삭제하지 않고 '사용하지 않음' 처리를 하기 때문에 update와 delete가 많이 발생한다면 실제 데이터보다 훨씬 많은 인덱스가 존재하게 되고 이로 인해 성능이 저하되게 되는 것이다.
인덱스(index)를 사용하면 좋은 경우
- 규모가 작지 않은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼 등..
인덱스의 자료구조
- 해시테이블
- B*Tree 기반 인덱스 : 데이터베이스에서 많이 사용됨. 균형트리구조이며 다차원 정렬이 가능하고 효율적인 검색과 삽입이 가능하다. 또, 페이지 단위로 데이터를 읽어 I/O 비용이 최소화 될 수 있다.
프로세스 & 스레드
프로세스 : 메모리에 올라와 실행되고 있는 프로그램의 인스턴스.
- CPU 시간, 주소공간, 독립된 메모리 영역 등의 시스템 자원을 OS로부터 할당받는다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC)을 사용해야 한다.
*IPC: Inter-Process Communication. 파이프, 파일, 소켓 등을 이용한 통신 방법.
- 기본적으로 프로세스 당 최소 하나의 스레드(메인스레드)를 가진다.
스레드 : 한 프로세스 내에서 동작되는 여러 실행의 흐름. 실행 단위이자 스케줄링 단위이다.
- 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 있는 스레드끼리 공유하며 실행된다.
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
SQL join의 종류
조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것.
- INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
- OUTER JOIN(외부 조인)은 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
- CROSS JOIN(상호 조인)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.
- SELF JOIN(자체 조인)은 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.
OUTER JOIN(외부 조인)
내부 조인은 두 테이블에 모두 데이터가 있어야만 결과가 나오지만, 외부 조인은 한쪽에만 데이터가 있어도 결과가 나옵니다.
OUTER JOIN의 종류
- LEFT OUTER JOIN: 왼쪽 테이블의 모든 값이 출력되는 조인
- RIGHT OUTER JOIN: 오른쪽 테이블의 모든 값이 출력되는 조인
- FULL OUTER JOIN: 왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 조인 (잘 사용하지 x)
CROSS JOIN(상호 조인) (잘 사용하지 x)
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능이다. 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼 된다. 카티션 곱(CARTESIAN PRODUCT)라고도 한다.
SELF JOIN(자체 조인) (잘 사용하지 x)
자체 조인은 자기 자신과 조인하므로 1개의 테이블을 사용한다. 별도의 문법이 있는 것은 아니고 1개로 조인하면 자체 조인이 된다.
ALGORITHM CODE KATA
Ⅰ. △△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다. 이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다. (school.programmers.co.kr)
def solution(n,a,b):
answer = 0 # 라운드 회차
while n >= 2:
n //= 2
a = (a+1)//2
b = (b+1)//2
answer += 1
if a==b:
break
return answer