Index 인덱스

인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치이다. 예를 들어 책의 마지막 장에 있는 찾아보기를 생각하면 된다. 

책의 본문이 있고 그 본문 안에 내가 찾고자 하는 '항목'을 찾아보기를 통해 빠르게 찾을 수 있다. 이와 마찬가지로 인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 빠르게 찾을 수 있다. 

 

B-트리

인덱스는 보통 B-트리 자료 구조로 이루어져 있다. 이는 루트 노트, 리프 노트, 그리고 루프 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다. 

 

| 출처 | 

면접을 위한 CS 전공지식 노트


인덱스와 Like 조건

Like절에서 %위치에 따른 인덱스 활용 여부

%가 문자열의 앞, 중간, 뒤에 올 때 인덱스를 활용할 수 있는지 여부가 달라진다.

 

CREATE INDEX idx_name ON users(name); // 인덱스 생성 예시

위와 같이 users 테이블의 name 컬럼에 대해 인덱스를 생성한다고 전제한다. 이 인덱스는 name 컬럼의 처음부터 끝까지 값을 기준으로 탐색할 수 있게 해준다. 

 

1. %가 뒤에 있을 때 (LIKE 'test%')

인덱스 활용 가능 하다.

 

2. %가 앞에 있을 때 (LIKE '%test') 또는 %가 중간에 있을 때 (LIKE '%test%')

인덱스 사용 할 수 없다. 

인덱스는 문자열의 처음부터 탐색하기 때문에  LIKE '%test'  처럼 끝나는 문자열을 찾는 조건 ( 또는 LIKE '%test%' 처럼 중간에 %가 있는 경우) 에서는 테이블을 전체적으로 스캔한다.

 

결론

인덱스가 문자열의 처음부터 끝까지 순차적으로 탐색하는 방식이기 때문에, %가 앞이나 중간에 있을 경우 인덱스는 활용되지 않는다. 

 

참고 

https://gyoogle.dev/blog/computer-science/data-base/Index-.html 

https://rachel0115.tistory.com/entry/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-INDEX-%EC%A0%95%EB%A6%AC-%EB%8F%99%EC%9E%91-%EB%B0%A9%EC%8B%9D-%EC%83%9D%EC%84%B1-%EC%82%AD%EC%A0%9C-%EC%84%A4%EA%B3%84 

https://www.youtube.com/watch?v=iNvYsGKelYs 

ChatGPT


트랜잭션

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스의 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다. 이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있으며 이를 한꺼번에 ACID 특징 이라고 한다. 

 

원자성 atomicity 

"all or nothing" 

트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다. 예를 들어 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다.

- 커밋과 롤백

 

일관성 Consistency 

'허용된 방식' 으로만 데이터를 변경해야 하는 것을 의미한다. 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 한다. 예를 들어 홍철이는 1000만원이 있고 범석이는 0원이 있다고 친다. 범석이가 나한테 500만원을 입금 할 수 있느냐? 블가능 하다. 0원으로부터 500만원이 나오는 것은 불가능 하니까. (마이너스 통장 제외)

 

격리성 isolation 

트랜잭션 수행 시 서로 끼어들지 못하는 것을 말한다. 복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다. 그냥 수너차적으로 하면 쉽게 되겠지만, 그러면 성능은 나쁘겠지? 격리성은 여러 개의 격리 수준으로 나위어 격리성을 보장한다.. 이하 생략

 

지속성 durability 

성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다. 이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻하며, 데이터베이스는 이를 위헤 체크섬, 저널링, 롤백 등의 기능을 제공한다. 

 

그리고 '무결성'

무결성이란 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말하며, 무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다. 무결성의 종류는 다음과 가탇. 

- 개체 무결성, 참조 무결성, 고유 무결성, NULL 무결성 .. 이하 생략 

 

 

| 출처 | 

면접을 위한 CS 전공지식 노트

 

참고 

https://gyoogle.dev/blog/computer-science/data-base/Transaction.html 

 

DB 트랜잭션(Transaction) | 👨🏻‍💻 Tech Interview

DB 트랜잭션(Transaction) 트렌잭션이란? 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위 상태를 변화시킨다는 것 → SQL 질의어를 통해 DB에 접근하는 것 작업 단위 → 많은 SQL 명령문들

gyoogle.dev


트랜잭션 동기/비동기 처리

(! 여기서의 트랜잭션은 위의 DB에서 수행되는 일련의 작업 단위의 트랜잭션을 의미하는게 아니라, 하나의 논리적 작업 단위를 말한다. 글을 나누기 애매해서 일단 요기 포스팅함ㅋ)

동기 트랜잭션 처리 Synchronous Transaction

요청을 보낸 후 응답을 받을 때까지 대기하는 방식이다. 즉, 요청을 처리하는 동안 클라이언트나 서버는 결과를 기다린다.

요청에 대해 응답을 받을 때까지 기다려야 하므로 시스템의 응답 시간이 길어질 수 있다. 

 

비동기 트랜잭션 처리 ASynchronous Transaction

요청을 보내고 결과를 기다리지 않고 다른 작업을 진행하는 방식이다. 즉, 요청을 보내고 나서 결과를 기다리지 않고 다음 작업으로 넘어갈 수 있다.

결과를 기다리지 않으므로 빠른 응답을 제공할 수 있다. 요청과 응답 사이에 지연을 최소화할 수 있다.

 

예시 답변:
"트랜잭션 처리에서 동기와 비동기 방식은 요청과 응답의 처리 방식에서 큰 차이를 보입니다. 동기 방식은 요청을 보내고 그 결과가 돌아올 때까지 기다린 후에 그 다음 작업을 진행하는 방식입니다. 이 방식은 결과의 일관성을 보장할 수 있지만, 응답 시간이 길어질 수 있어 성능이 떨어질 수 있습니다. 예를 들어, 결제 처리 시스템에서는 사용자가 결제를 완료하기 전까지 결과를 알 수 없으므로 동기 방식이 적합합니다.

반면에 비동기 방식은 요청을 보낸 후 그 결과를 기다리지 않고, 다른 작업을 처리할 수 있게 해줍니다. 비동기 방식은 응답 시간을 단축시키고, 시스템 자원을 효율적으로 사용할 수 있어 대규모 시스템에 유리합니다. 예를 들어, 이메일 전송 시스템에서 이메일을 전송한 후 바로 다른 작업을 진행하는 방식은 비동기 방식이 적합합니다."

 

참고 https://f-lab.kr/insight/understanding-async-sync-transactions-20240915 

ChatGPT

'CS' 카테고리의 다른 글

관계형 데이터베이스(RDBMS)와 NoSQL(Not Only SQL) / 레디스 Redis  (0) 2024.12.04
varchar와 nvarchar의 차이  (0) 2024.12.04
조인(Join)의 종류  (0) 2024.12.03

+ Recent posts