Study 54

조인 방식 비교 (네스티드 루프 조인 VS 블록 네스티드 루프 조인 VS 해시 조인)

1. 네스티드 루프 조인 (Nested Loop Join)조인 연결 컬럼에 모두 인덱스가 있을 때 사용하는 기본 조인 방식드라이빙 테이블에서 레코드 1건 읽기 ↓즉시 드리븐 테이블에서 일치하는 레코드 찾기 ↓별도 버퍼 없이 바로 반환 (중첩 반복문과 유사)드리븐 테이블 인덱스가 없으면 왜 느린가?드라이빙 테이블 일치 레코드 = 1,000건 ↓드리븐 테이블 인덱스 없음 ↓드리븐 테이블 풀 스캔 1,000번 수행 → 매우 느림👉 옵티마이저는 최대한 드리븐 테이블이 인덱스를 사용하도록 실행 계획을 수립한다.2. 블록 네스티드 루프 조인 (Block Nested Loop Join)드리븐 테이블에 인덱스를 사용할 수 없을 때 조인 버퍼를 활용하는 방식블록 네스티..

Study/MySQL 2026.03.16

MySQL 풀 테이블 스캔과 리드 어헤드

풀 테이블 스캔(Full Table Scan) 선택 조건레코드 수가 너무 적을 때인덱스를 거치는 것보다 전체 스캔이 더 빠른 경우 (보통 테이블이 1페이지로 구성된 경우)적절한 인덱스 조건 없음WHERE절이나 ON절에 사용할 수 있는 인덱스가 없는 경우일치 레코드가 너무 많을 때인덱스 레인지 스캔이 가능하더라도, 조건에 맞는 레코드가 너무 많다고 판단한 경우리드 어헤드리드 어헤드(Read Ahead): 앞으로 필요할 데이터를 요청 전에 미리 디스크에서 읽어 버퍼 풀에 적재해두는 InnoDB의 최적화 기법이다. - 풀 테이블 스캔 시 리드 어헤드 동작 흐름① 포그라운드 스레드가 처음 몇 개의 페이지를 읽기 시작 ↓② 특정 시점이 되면 백그라운드 스레드로 읽기 작업을 넘김 ↓③ 백그..

Study/MySQL 2026.03.08

B-Tree 인덱스를 통한 데이터 읽기

인덱스 레인지 스캔인덱스 레인지 스캔은 인덱스에서 어디부터 어디까지 읽을지 범위가 정해졌을 때 사용하는 방식.예시) WHERE name >= 'Kim' AND name 와 같은 범위 검색에서단계 1: “어디서부터 읽을지 찾는 과정” 단계트리 위에서 아래로 내려가면서 시작 지점을 찾는다.단계 2: 스캔 단계시작 리프 노드를 찾았으면 리프 노드 안에서 정렬된 순서대로 쭉 읽는다.리프 노드는 서로 링크(포인터) 로 연결되어 있어서, 한 리프 노드를 끝까지 읽으면 링크를 타고 다음 리프 노드로 이동해서 계속 읽음단계 3: 실제 데이터 읽기 단계 👉 이 단계에서 랜덤 I/O 발생인덱스에는 보통 키 값과 레코드 주소(PK 또는 ROWID)인덱스에서 얻은 주소를 이용해실제 데이터 페이지를 다시 읽음최종 레코드 반..

Study/MySQL 2026.03.02

B-Tree 인덱스 사용에 영향을 미치는 요소

인덱스 키 값의 크기인덱스 키가 커지면 발생하는 일로는 인덱스는 디스크에 저장되고, 검색 시 디스크 또는 메모리(Buffer Pool)에서 한 페이지 단위로 읽힌다.그런데 인덱스 키 값이 길어질수록 한 페이지에 저장할 수 있는 레코드 수가 줄어든다.👉 같은 데이터를 찾기 위해 더 많은 페이지를 읽어야 할 수 있음으로, 디스크 I/O 증가하고 검색 속도 저하인덱스 키 값이 작아야하는 이유인덱스에 저장되는 값의 바이트 수가 적어야한다는 의미왜 작아야 좋을까?InnoDB는 인덱스를 16KB 페이지 단위로 저장한다.키가 작으면한 페이지에 더 많은 인덱스 레코드 저장 가능B-Tree 높이가 낮아짐디스크 I/O 감소메모리 캐시 효율 증가인덱스의 선택도기본 상황SELECT *FROM bt_testWHERE coun..

Study/MySQL 2026.03.02

디스크 읽기 방식 HDD VS SSD

CPU랑 메모리CPU랑 메모리는 전기로만 움직이는 장치로, 기술이 발전하면서 속도가 엄청 빠르게 좋아졌다.CPU → 계산 속도 엄청 빨라짐메모리 → 데이터 읽고 쓰는 속도 엄청 빨라짐하드디스크(HDD)랑 SSD(Solid State Drive)하드디스크(HDD)는 안에 원판이 실제로 돌아가는 기계 장치로물리적으로 움직여야 함읽을 위치까지 헤드가 이동해야 함시간이 오래 걸림👉 그래서 CPU/메모리만큼 빨리 발전하지 못했다.이러한 기계식 하드디스크 드라이브를 대체하기 위해 전자식 저장 매체인 SSD(Solid State Drive)가 출시됨.SSD는 기존 하드디스크 드라이브에서 원판를 제거하고, 그 대신 플래시 메모리를 장착움직이는 부품 없음그냥 전기 신호로 바로 읽음위치 이동 개념이 거의 없음👉 랜덤으..

Study/MySQL 2026.03.01

MySQL 격리 수준

격리 수준: 하나 트랜잭션 애에서 또는 서로 다른 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨을 의미한다.READ UNCOMMITED는 일반적인 데이터베이스에서는 거의 사용하지않고, SERIALIZABLE 또한 동시성이 중요한 데이터베이스에서는 거의 사용되지않는다.READ COMMITTED 격리 수준에서는 트랜잭션내에서 실행되는 SELECT 문장과 트랜잭션 외부에서 실행되는 SELECT 문장의 차이가 별로지만, REPEATABLE READ 격리 수준에서는 기본적으로 SELECT 쿼리 문장도 트랜잭션 범위 내에서만 작동한다. READ UNCOMMITTEDREAD UNCOMMITTED에서는 더티 리드(Dinty read)이라고 하는 현상이 발생한다.사용자 Aemployees 테이..

Study/MySQL 2026.02.17

Spring에서 Bean 생명주기 개념 정리

스프링 컨테이너와 ApplicationContext란?Spring에서 객체를 관리하는 핵심은 바로 스프링 컨테이너입니다. 이 컨테이너는 객체(Bean)를 생성하고, 의존성을 주입하며, 생명주기를 관리합니다.ApplicationContext는 스프링 컨테이너의 구체적인 구현체이며, BeanFactory를 확장합니다.BeanFactory가 최소 기능만 제공하는 반면, ApplicationContext는 다음을 포함한 다양한 기능을 제공합니다대부분의 스프링 애플리케이션에서는 ApplicationContext를 사용합니다. Bean 생명주기 전체 흐름Spring에서 Bean의 생명주기는 다음과 같은 순서로 진행됩니다.Bean 인스턴스 생성 (생성자 호출)의존성 주입 (필드, 생성자, setter 등)BeanNa..

Study/SpringBoot 2025.05.17

Spring MVC와 Spring Security의 예외 처리 차이점

예외 처리란?먼저 "예외 처리"는 프로그램 실행 중에 문제가 생겼을 때(예: 로그인 실패, 없는 사용자 요청 등), 그 문제를 적절하게 처리해서 사용자에게 이해할 수 있는 응답을 보내는 걸 말한다.Spring MVC의 예외 처리Spring MVC에서는 컨트롤러에서 예외가 터졌을 때 자동으로 예쁘게 처리할 수 있게 도와주는 여러 기능을 제공하는데, 대표적으로@ExceptionHandler@ResponseStatus@ControllerAdvice1. @ExceptionHandler@ExceptionHandler(MyCustomException.class)public ResponseEntity handleMyException(MyCustomException ex) { return ResponseEntit..

Study/SpringBoot 2025.05.05

Redis, Redis Pub/Sub, Redis Stream( VS Kafka)

1️⃣ Redis(Remote Dictionary Server)란 무엇인가?= 키-값(key-value) 구조로 데이터를 저장하는 인메모리 데이터 저장소.Redis의 특징항목 설명인메모리디스크 대신 메모리에 저장해서 빠른 속도Persistence 지원필요하면 디스크에 주기적으로 저장 가능 (AOF, RDB)다양한 자료구조String, List, Set, Sorted Set, Hash, HyperLogLog 등싱글 스레드 기반I/O 멀티플렉싱으로 고성능 유지 (논블로킹)Pub/Sub 지원메시지 브로커처럼 채널 기반 발행/구독 가능간단한 설치 및 사용몇 줄 명령어로 바로 사용 가능 2️⃣ Redis가 동작하는 원리1. 인메모리 저장모든 데이터는 RAM(메모리)에 저장.→ 읽기/쓰기가 수천~수만 QPS(초당 ..

Study 2025.04.27

MySQL 인덱스의 종류와 사용 기준, 주의사항

1. 인덱스란?인덱스는 데이터베이스 테이블에서 원하는 데이터를 더 빠르게 찾기 위해 사용하는 자료구조야.일반적으로 B-Tree 구조를 사용WHERE 조건이나 JOIN, ORDER BY, GROUP BY 등을 사용할 때 검색 성능을 높여줘. 2. MySQL 인덱스의 종류BRIN, GIN은 MySQL에서 지원하지 않고 Partial B-Tree도 거의 사용되지 않음👉 MySQL에서 거의 모든 경우 B-Tree 기반 인덱스 사용3. 인덱스를 설정하는 기준 (언제 인덱스를 걸어야 할까?)조건 설명WHERE 절 자주 사용예: SELECT * FROM users WHERE email = 'abc@email.com'JOIN의 ON절두 테이블을 자주 조인하는 컬럼에 인덱스를 설정해야 빨라져ORDER BY / GROU..

Study 2025.04.20