본문 바로가기

데이터베이스/RDB11

B+Tree, B-Tree 그림 B-Tree 인덱스의 클러스터링 인덱스PK, 데이터, 자식 노드 포인터로 이루어짐 B-Tree의 세컨더리 인덱스인덱스 컬럼, PK, 자식노드 포인터로 이루어짐리프노드에는 자식노드 포인터 없음 B+Tree의 클러스터링 인덱스.PK, 자식 노드 포인터로 이루어짐 데이터는 리프노드에만 있음리프노드에는 자식 노드 포인터 대신 데이터가 삽입 B+Tree의 세컨더리 인덱스루트노드와 브랜치 노드의 오른쪽 값은 자식 노드 포인터리프노드의 오른쪽 값은 PK 2026. 4. 9.
GROUP BY 그룹바이도 오더바이처럼 쿼리의 스트리밍 처리가 불가능 함그룹바이에 사용된 조건은 인덱스를 사용해서 처리될 수 없으므로 HAVING절을 튜닝할 필요 없다. 그룹바이도 인덱스를 사용하는 경우와 못하는 경우로 나뉘는게 가능함1. 인덱스 사용 - 타이트 인덱스 스캔2. 인덱스 사용 - 루스 인덱스 스캔 : 실행계획에 Using index for group-by 표시3. 인덱스 불가 - 임시 테이블 : 실행계획에 Using temporary 표시 1. 타이트 인덱스 스캔인덱스를 읽으며 그룹핑 작업을 수행하고 그 결과로 조인을 처리함 조건1. 조인의 드라이빙 테이블에 속한 칼럼만 이용해 그룹핑2. 그룹 바이 칼럼에 인덱스 존재3. WHERE 조건절이 있지만 WHERE 조건절이 인덱스를 활용하지 못할 때 2. 루스 .. 2026. 3. 15.
ORDER BY (정렬) 1. 정렬 서론크게 두가지로 나뉜다.1. 인덱스를 사용하는 방법2. Filesort를 별도로 사용 인덱스 장점 - 인덱스 이미 정렬되어있어서 엄청 빠름인덱스 단점 - 인덱스의 단점을 모두 공유파일소트 장점 - 인덱스를 별도로 안만드는것, 정렬해야할 레코드가 많지 않으면 메모리에서 처리되므로 충분히 빠름파일소트 단점 - 대상 레코드가 많아질 수록 느리다 모든 정렬이 인덱스를 이용하도록 하는건 사실상 어렵다.정렬 기준이 너무 많아 요건별로 인덱스를 생성하기 어려움그룹바이나 디스딩트의 결과를 처리UNION같은 임시 테이블의 결과를 정렬랜덤하게 결과 레코드를 가져올때 2. 소트 버퍼정렬을 수행하기위한 별도의 메모리 공간이다세션 메모리 영역에 해당함 공유 불가의 공간정렬이 필요한 공간때 할당되어 쿼리 실행 완.. 2026. 3. 15.
풀 테이블 스캔 vs 풀 인덱스 스캔 1. 풀 테이블 스캔- 레코드의 건수가 너무 작아서 인덱스를 통해 읽는 것 보다 풀 테이블 스캔이 더 빠를때- WHERE 절이나 ON절에 인덱스를 이용할 수 있는 적절한 조건이 없을 때- 인덱스 레인지 스캔을 사용할 수 있어도 옵티마이저가 판단한 조건 일치 레코드가 너무 많을 때- count(컬럼)같은 경우 인덱스가 설정되지 않으면 풀 테이블 스캔할 수 있다. 2. 풀 인덱스 스캔- count(*) 개수만 조회하면 되므로 테이블보단 인덱스가 싸다. 2026. 3. 15.
MySQL의 쿼리 실행 구조 MySQL서버는 MySQL엔진과 스토리지엔진으로 나누어져있다. MySQL엔진은 쿼리 파서, 전처리기, 옵티마이저, 쿼리 실행기등을 가지고 있고 스토리지 엔진은 InnoDB, MyISAM등의 종류가 있다. 1. 쿼리 파서쿼리 파서는 사용자 요청으로 들어온 쿼리를 MySQL이 인식할수있는 최소 단위인 토큰으로 분리해 트리 형태의 구조로 만들어낸다. 쿼리의 문법 오류등은 이 과정에서 발견된다. 2. 전처리기파서 트리를 기반으로 쿼리 문장에 문제점이 있는지 확인한다. 테이블 이름, 칼럼 이름등이 실제로 존재하는지 접근할 수 있는지의 과정을 이 단계에서 수행한다. 3. 옵티마이저DBMS의 두뇌로 쿼리를 가장 저렴한 비용으로 탐색할 수 있는 경로를 찾아낸다. 4. 실행엔진실행엔진은 옵티마이저가 만든 계획대로 핸들.. 2026. 3. 8.
바인드 변수의 중요성 SQL을 실행하면 파싱하고 최적화한다 이때마다 연산은 불필요하기에 보통 DB안에는 라이브러리 캐시가 있다. 만약 SQL문을 SELECT * FROM CUSTOMER WHERE LOGIN_ID = '" + login_id + "'";로 작성한다면라이브러리 캐시에는 SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'a'SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'b'SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'c'SELECT * FROM CUSTOMER WHERE LOGIN_ID = 'd'등등이 가득차있다. 그때마다 캐시를 생성하는 것이다 그런데 만약 SELECT *FROM CUSTOMER WHERE LOGIN_ID = ?; 로.. 2026. 2. 26.
인덱스 스캔 선택도란?참고로 선택도란 인덱스 컬럼의 값이 얼마나 유일한지에 대한 지표다. 성별컬럼은 남자와 여자로 이루어져있기에 값이 2개 뿐이라 선택도가 매우 낮다. 따라서 인덱스 컬럼은 선택도가 높은 컬럼으로 지정하는게 좋다. 비용이란?비용이란 시스템의 성능, 안전성, 보안, 유지보수등에 지출되는 비용을 의미한다 DB에서 비용은 하드웨어, 소프트웨어, 인력, 보안, 유지보수 비용등의 요소가 포함되어있다. 수직적 탐색이란?B+tree에서 Root 노드에서 시작해 필요한 데이터가 있는 리프 노드까지 아래로 내려가는 탐색WHERE id = 100 같이 정확한 값을 찾을 때 id 인덱스 트리를 따라 100을 찾아간다. 수평적 탐색이란?수직적 탐색에서 찾은 첫 번째 리프노드에서 시작하여 인접한 리프 노드들을 좌우로 연결 .. 2026. 1. 10.
순차I/O와 랜덤I/O 순차I/O는 데이터를 연속적인 블록으로 순차적으로 읽거나 쓰는 작업이다.랜덤I/O는 데이터를 임의의 위치에서 읽거나 쓰는 작업이다. 순차I/O는 SSD에서 HDD보다 성능이 폭발적으로 상승하진않았지만. 랜덤 I/O는 SSD에서 성능이 크게 상승다.DB에서 일어나는 작업의 대부분은 랜덤 I/O기 때문에 RealMysql8.0에서는 SSD와 HDD의 초당 트랙잭션 처리 성능차이가 약 7배 라고 설명한다. 최근에 대부분 DBMS는 SSD를 채택한다. HDD에서 두 I/O의 공통점은 원판은 돌려서 읽어야 할 데이터가 저장된 위치까지 디스크 헤더를 이동시킨다는 것두 I/O의 성능차이는 디스크 헤더의 이동 횟수에서 발생한다. 디스크 헤더가 이동되는 시간을 seek time이라고 하는데 그 시간에 의해 좌우되는 것이.. 2026. 1. 10.
데이터베이스 격리수준 출처 쉬운코드 https://www.youtube.com/watchv=bLLarZTrebU&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=17 Dirty Read : commit 되지 않은 변화를 읽음x가 10 y가 20 이었을 때 Non-repeatable read : 같은 데이터의 값이 달라짐x는 최초에 10 Phantom read : 없던 데이터가 생김두개의 튜플이 있음 최초 t1은 v가 10 t2는 v가 50 격리수준1. Read uncommitted : 커밋되지 않은 읽기 허용2. Read commited : 커밋된 읽기만 허용 Dirty Read 까지 방지3. Repeatable read : Non-repeatable read 까지 방지4. Serial.. 2025. 12. 23.
데이터베이스 동시성제어 (2) 회복불가능한 스케줄스케줄 내에서 커밋된 트랜잭션이 롤백된 트랜잭션이 write 했었던 데이터를 읽은경우롤백을해도 이런 스케줄은 이전 상태로 회복 불가능할 수 있기 때문에 이런 스케줄은 dbms에서 허용하면안됨회복가능한 스케줄스케줄 내에서 어떤 트랜잭션도 자신이 읽은 데이터를 write한 트랜잭션이 먼저 커밋/롤백하기 전까지는 커밋하지 않는 경우캐스캐이딩 롤백하나의 트랜잭션이 롤백하면 의존성이있는 다른 트랜잭션도 롤백하는 것여러 트랜잭션의 롤백이 연쇄적으로 일어나면 처리하는 비용이 많이 듬캐스캐이드리스 스케줄스케줄 내에서 어떤 트랜잭션도 커밋되지않은 트랜잭션들이 write한 데이터를 읽지않은 경우 하지만 읽기작업이 없을시 일부 트랜잭션의 결과가 무효화될 수 있음엄격한 스케줄스케줄 내에서 어떤 트랜잭션도 커.. 2025. 12. 23.
데이터베이스 동시성 제어 (1) 스케줄은 여러 트랜잭션이 동시에 실행될때 각 트랜잭션에 속한 명령의 실행순서시리얼 스케줄 (순차 스케줄) 트랜잭션들이 겹치지않고 한번에 하나씩 실행되는 스케줄비정상데이터가 생길일은 없지만 한번에 하나씩 실행되어서 성능이 안좋음 현실적으로 안쓰임I/O 작업이 끝날때까지 CPU가 대기논시리얼 스케줄 (비 순차 스케줄) 트랜잭션들이 겹쳐서(인터리빙) 되어 실행되는 스케줄I/O 작업이 끝나지않아도 다른 트랜잭션 실행 CPU 놀지않음같은시간동안 더 많은 트랜잭션 처리가능비정상데이터 생길 가능성있음논시리얼 스케줄에서 성능을 챙기는 방법Conflict란두가지의 명령이 있을때1. 각 명령이 서로 다른 트랜잭션이다2. 같은 데이터에 접근한다3. 최소하나는 write명령이다세가지를 만족하면 두 명령은 컨플릭트하다 라고함컨.. 2025. 12. 23.