반응형

1. 인덱스의 정의

  • 인덱스(Index)는 테이블의 특정 컬럼(column)에 대해 검색 속도를 높이기 위해 추가로 만든 자료 구조
  • 책의 목차처럼, 원하는 데이터가 테이블 전체를 뒤지지 않고도 바로 위치를 찾을 수 있게 해주는 구조

2. 인덱스의 종류

1) B-Tree 인덱스 (가장 흔함)

  • 균형 이진 트리(B+Tree) 구조 사용
  • 장점:
    • 특정 값 검색: O(log n)
    • 범위 검색: 효율적 (e.g., WHERE age BETWEEN 20 AND 30)
  • 사용 예시: PRIMARY KEY, UNIQUE 인덱스

2) Hash 인덱스

  • 해시 테이블 기반
  • 장점:
    • 정확한 값 검색: O(1) 평균
  • 단점:
    • 범위 검색에는 부적합
  • 사용 예시: MySQL MEMORY 엔진

3) 기타

  • Full-text 인덱스: 문자열 검색 최적화
  • Spatial 인덱스: 지리정보 데이터 최적화
  • Composite(복합) 인덱스: 여러 컬럼 조합 검색에 사용

B-Tree 와 Hash Index 시간 복잡도 비교

연산 종류 B-Tree (또는 B+Tree) Hash 설명
정확한 값 검색 (Equality lookup) O(log N) O(1) 평균O(N) 최악 Hash는 정확 검색에 특화된 순간이동 느낌. B-Tree는 계층을 타고 내려가는 구조.
범위 검색 (Range query) O(log N + K) 불가능 Hash는 키→버킷 맵핑이라 순서를 모름. B-Tree는 정렬된 상태라 범위 탐색 가능.
정렬된 순회 (Ordered scan) O(N) 불가능 Hash는 정렬 상태를 유지하지 않음.
삽입 (Insert) O(log N) O(1) 평균O(N) 재해시 발생 시 Hash는 공간 부족 시 전체 테이블 재정비가 필요해 최악이 무겁다.
삭제 (Delete) O(log N) O(1) 평균 Hash는 버킷만 정리하면 OK.
메모리 사용량 중간 Hash는 충돌 방지를 위해 여분 메모리를 더 들고 다닌다.

 

반응형

'DataBase > MySQL' 카테고리의 다른 글

[MySQL] 행, 열 변환 작업  (0) 2021.08.04
[MySQL] AUTO_INCREMENT 초기화  (0) 2021.02.01
[MySQL] WITH 재귀(RECURSIVE) 쿼리 계층구조  (0) 2020.07.20
[MySQL] CASE 문  (0) 2020.07.20
[MySQL] DATE_FORMAT 날짜데이터 형식 변환  (0) 2020.07.20
반응형

트랜잭션(Transaction)

데이터베이스의 상태를 변경하는 하나의 논리적 작업 단위입니다. 이 작업들은 모두 성공하거나 모두 실패하며, 오류 복구를 단순화하고 데이터의 일관성과 신뢰성을 보장합니다. 또한, 웹에서는 클라이언트와 서버가 데이터를 주고받는 일련의 과정을 의미하기도 합니다. 

트랜잭션의 ACID 속성

속성 설명
원자성(Atomicity) 트랜잭션 내의 모든 작업이 성공하거나 실패해야 합니다.

작업 묶음이 쪼개지지 않고 하나처럼 움직여야 한다는 원리.
실패하면 전체가 롤백되고, 성공하면 전체가 커밋됩니다.
일관성(Consistency) 트랜잭션이 수행되는 동안 데이터베이스의 일관성이 유지됩니다.

트랜잭션 전후로 데이터 규칙, 제약조건, 도메인 법칙이 깨지지 않는 것.
예: 재고가 음수가 되면 안 된다는 규칙 같은 것들.
고립성(Isolation) 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행됩니다.


동시에 여러 트랜잭션이 실행되더라도
서로 방해하지 않고 독립적으로 보이게 해야 한다는 원칙.
바로 여기서 격리 수준이 등장합니다.
Isolation은 하나의 철학이고, Isolation Level은 그 철학을 얼마나 강하게 적용할지 정한 옵션입니다.
지속성(Durability) 성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영됩니다.

트랜잭션이 커밋되면
정전, 서버 고장, 시스템 재부팅 등에도 데이터는 살아남는다는 보장.
스토리지 단까지 안전히 기록되는 것을 의미합니다.

트랜잭션 격리 수준

격리 수준 Dirty Read Non-Repeatable Read Phantom Read 특징 요약 
Read Uncommitted 허용 허용 허용 거의 격리 없음. 읽기 성능 최우선 환경에서만 사용
Read Committed 방지 허용 허용 대부분의 DB 기본값. 커밋된 데이터만 읽는다
Repeatable Read 방지 방지 DB마다 다름 (MySQL은 방지) 같은 행을 항상 동일하게 본다
Serializable 방지 방지 방지 완전한 직렬화. 가장 안전하지만 가장 비용 높음

트랜잭션 격리 수준별 예시

1) Read Uncommitted

마치 창고 문이 열려 있는데, 안에서 아직 포장 중인 상품을 미리 들여다보는 느낌.

✅ T2가 커밋하지 않은 값도 읽을 수 있음 (Dirty Read)

예시

  • T2: 잔액을 100에서 0으로 변경 중(아직 커밋 안됨)
  • T1: 잔액 조회 -> 0 으로 보임
  • T2: 롤백
  • T1: "어? 방금 0이었는데 왜 다시 100이지?"

혼란이 생기는 환경.

2) Read Committed

남이 박스를 닫고 테이핑 완료해야만 볼 수 있는 상태.

✅ Dirty Read 방지
❌ Non-Repeatable Read 발생

예시

  • T1: 잔액 조회 -> 100
  • T2: 잔액을 150으로 변경 후 커밋
  • T1: 다시 잔액 조회 -> 150
  • T1이 같은 트랜잭션 안에서 두 번 읽었는데 값이 바뀜

3) Repeatable Read

일단 문을 닫아 잠그면, 그 안의 물건은 내가 보는 동안 바뀌지 않는 느낌.

✅ Dirty Read 방지
✅ Non-Repeatable Read 방지
❌ Phantom Read 가능(DB 종류에 따라 다름)

예시(고전적인 버전)

  • T1: “잔액이 100인 계좌 조회”
  • T2: 그 계좌 수정 → 커밋
  • T1: 같은 계좌 다시 조회 → 여전히 100으로 보인다 (스냅샷 유지)

하지만
T1이 “잔액이 100 이상인 모든 계좌 목록”을 읽을 때는:

  • T1: 목록 읽기 → 5개
  • T2: 새 계좌 추가 → 커밋
  • T1: 목록 다시 읽기 → 6개 (행이 “훅” 나타남)

이 새롭게 나타난 행이 Phantom(유령) 현상.

참고: MySQL(InnoDB)
Repeatable Read에서 Gap Lock을 사용해 Phantom Read도 방지함.

4) Serializable

모든 트랜잭션을 “차례대로 줄 세워서” 처리하는 느낌.

✅ Dirty Read 방지
✅ Non-Repeatable Read 방지
✅ Phantom Read 방지
✅ 가장 안전
❌ 성능 부담 가장 큼 (대기시간 증가)

예시

  • T1: “잔액 100 이상 계좌 목록 조회 시작”
  • T2: 새로운 계좌 추가 시도 → T1이 끝날 때까지 대기
  • T1이 끝난 뒤에야 T2가 실행됨

DB가 트랜잭션을 하나씩 순차적으로 실행하는 것처럼 보이게 만든다.

트랜잭션 예시

BEGIN
   여러 개의 SQL 실행
COMMIT 또는 ROLLBACK

 

반응형
반응형

행, 열 변환 작업

테이블의 행 데이터를 특정 기준으로 열 데이터로 변환하는 작업


■ 예시

과일 가게에서 판매하고 있는 과일은 [수박], [사과], [오렌지] 라고 특정할때, 날짜 별로 과일들의 수량을 계산하여 통계치를 구하려고 한다.

 

왼쪽은 과일이 판매될때 마다 작성한 데이터이고, 오른쪽은 구하고자 하는 결과 데이터이다. 

■ 작업

첫번째, 과일 가게 가계부 테이블를 생성한다.

CREATE TABLE `tbl_fruit_shop` (
  `pay_time` date NOT NULL COMMENT '구매 날짜',
  `fruit` varchar(50) NOT NULL COMMENT '과일',
  `cnt` int(11) NOT NULL COMMENT '수량'
)
반응형

두번째, 과일 가게 가계부 테이블를 조회했을 때 결과를 확인한다.

 * 결과 데이터는 [예시]의 왼쪽 데이터와 동일하다고 가정한다.

 

결과)


세번째, 각 행을 과일 별로 구분하여 데이터를 출력한다.

 * [CASE 문] 을 통해 행으로 구분되어 있던 데이터를 열로 수정

SELECT pay_time,
          CASE WHEN fruit='수박' THEN cnt END AS 수박,
          CASE WHEN fruit='사과' THEN cnt END AS 사과,
          CASE WHEN fruit='오렌지' THEN cnt END AS 오렌지
FROM tbl_fruit_shop
ORDER BY pay_time
반응형

결과)


네번째, 날짜 별로 과일들의 수량을 합산한다.

 * [SUM 함수] 와 [GROUP BY 문법]을 통해 데이터를 그룹화 함과 동시에 과일별 수량 합산

SELECT pay_time,
          SUM(CASE WHEN fruit='수박' THEN cnt END) AS 수박,
          SUM(CASE WHEN fruit='사과' THEN cnt END) AS 사과,
          SUM(CASE WHEN fruit='오렌지' THEN cnt END) AS 오렌지
FROM tbl_fruit_shop
GROUP BY pay_time
ORDER BY pay_time

결과)


다섯째, 날짜 별로 판매되지 않은 과일의 수량은 0으로 치환한다.

 * [COALESCE 함수]를 이용하여 NULL인 데이터는 0으로 치환

SELECT pay_time,
          COALESCE(SUM(CASE WHEN fruit='수박' THEN cnt END), 0) AS 수박,
          COALESCE(SUM(CASE WHEN fruit='사과' THEN cnt END), 0) AS 사과,
          COALESCE(SUM(CASE WHEN fruit='오렌지' THEN cnt END), 0) AS 오렌지
FROM tbl_fruit_shop
GROUP BY pay_time
ORDER BY pay_time
반응형

결과)


반응형

'DataBase > MySQL' 카테고리의 다른 글

인덱스  (0) 2025.11.10
[MySQL] AUTO_INCREMENT 초기화  (0) 2021.02.01
[MySQL] WITH 재귀(RECURSIVE) 쿼리 계층구조  (0) 2020.07.20
[MySQL] CASE 문  (0) 2020.07.20
[MySQL] DATE_FORMAT 날짜데이터 형식 변환  (0) 2020.07.20
반응형

■ AUTO_INCREMENT 초기화

ALTER TABLE [테이블명] AUTO_INCREMENT=1;
SET @COUNT = 0;
UPDATE [테이블명] SET [컬럼명] = @COUNT:=@COUNT+1;

■ 예시

인덱스는 1부터 시작하며 로우가 추가됨에 따라 1씩 증가하는 컬럼으로 수정
ALTER TABLE tbl_user AUTO_INCREMENT=1;
SET @COUNT = 0;
UPDATE tbl_user SET user_id = @COUNT:=@COUNT+1;
반응형

'DataBase > MySQL' 카테고리의 다른 글

인덱스  (0) 2025.11.10
[MySQL] 행, 열 변환 작업  (0) 2021.08.04
[MySQL] WITH 재귀(RECURSIVE) 쿼리 계층구조  (0) 2020.07.20
[MySQL] CASE 문  (0) 2020.07.20
[MySQL] DATE_FORMAT 날짜데이터 형식 변환  (0) 2020.07.20
반응형

■ 설치경로

▶ 설치 경로로 이동

▶ 설치파일(msi) 원하는 경로에 다운로드

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com


 설치 순서

▶ 상위에서 설치된 설치파일 실행

'Next' 버튼 클릭

▶ 'I accept the terms in the License Agreement' 체크(동의)

'Next' 버튼 클릭

설치경로 지정

'Add the Redis installation folder to the PATH environment variable.' 체크(Redis 설치와 동시에 환경설정에 동의)

'Next' 버튼 클릭

Redis 포트(port) 번호 지정(디폴트 : 6379)

'Add an exception to the Windows Firewall' 체크(윈도우 방화벽 예외 추가 동의)

'Next' 버튼 클릭

Redis의 경우 디스크가 아닌 메모리의 데이터를 관리함으로 최대 메모리 설정을 원한다면

'Set the Max Memory limit' 체크후 아래 Max Memory의 값을 수정

그렇지 않을경우 체크하지 않는다.

'Next' 버튼 클릭

'Install' 버튼 클릭

다운로드 진행...

'Finish' 버튼 클릭

레디스(Redis) 설치 완료!!!


 설치 테스트 확인

1. 레디스(Redis) 서비스 중지

방법 1

Windows 키 + 'R' 입력

실행창 오픈

NET STOP Redis 입력(Redis 서비스 중지)

방법 2

서비스창으로 이동

Redis 서비스를 찾아서 서비스 중지 

 


2. 레디스(Redis) 서버 기동

Redis 설치 경로로 이동

▶ redis-server.exe(서버 기동파일 실행)

서버프롬프트가 도출되고 서버를 끄지않는다.

'redis-cli.exe' 파일 실행 레디스 작업 화면 도출

▶ ping 입력 후 결과로 PONG 이 도출된다면 레디스 설치 테스트 완료!!!


3. 레디스(Redis) 서비스 기동

방법 1

 Windows 키 + 'R' 입력

 실행창 오픈

 NET START Redis 입력(Redis 서비스 중지)

방법 2

 서비스창으로 이동

 Redis 서비스를 찾아서 서비스 시작

반응형
반응형

포스트그레스큐엘(PostgreSQL)란?

PostgreSQL은 오픈 소스 객체-관계형 데이터베이스 시스템(ORDBMS)으로, Enterprise급 DBMS의 기능과 차세대 DBMS에서나 볼 수 있을 법한 기능들을 제공한다.약 20여년의 오랜 역사를 갖는 PostgreSQL은 다른 관계형 데이터베이스 시스템과 달리 연산자, 복합 자료형, 집계 함수, 자료형 변환자, 확장 기능 등 다양한 데이터베이스 객체를 사용자가 임의로 만들 수 있는 기능을 제공함으로써 마치 새로운 하나의 프로그래밍 언어처럼 무한한 기능을 손쉽게 구현할 수 있다.


포스트그레스큐엘(PostgreSQL)의 특징 

1) 유연한 객체 생성

다른 관계형 데이터베이스 시스템과 달리, 연산자, 복합 자료형, 집계 함수, 자료형 변환자, 확장 기능 등 다양한 데이터베이스 객체를 사용자가 임의로 만들 수 있는 기능을 SQL 차원에서 제공한다.

이런 특징은 단순한 자료 저장소로써의 기능을 넘어 마치 하나의 새로운 프로그래밍 언어처럼 개발자의 창의성에 따라 무한한 기능을 손쉽게 구현할 수 있도록 한다.

2) 상속

java 또는 C++ 프로그래밍 언어와 같이 테이블을 만들어 그 테이블 상속 기능을 이용해 하위 테이블을 만들 수 있다.

테이블에 저장된 자료는 상위 테이블을 조회하면, 해당 테이블의 하위 테이블에 포함된 모든 자료를 조회할 수 있으며, 하위 테이블을 만들 때, 상위 테이블의 칼럼을 그대로 상속 받으면서, 하위 테이블에만 속하는 칼럼을 추가로 만들 수 있다.

3) 함수

때때로, '저장 프로시저'라고 불리는 SQL문으로 작성된 함수를 서버환경에서 사용할 수 있다. 비록 다른 언어와는 달리 제어문과 반복문을 사용하지는 못하지만, 다른 언어와 결합시킬 수 있다. 일부 언어에서는 심지어 트리거 내부에서 실행시킬 수 있다.

이러한 언어의 예는 다음과 같다.

 

  • PL/pgSQL (오라클의 PL/SQL과 유사하다)
  • 스크립트 언어를 통한 지원 (예, PL/Python, PL/php, PL/Perl)
  • 컴파일 언어를 통한 지원 (예, C/C++, PL/Java)
  • 통계적 언어를 통한 지원 (예, PL/R)

PostgreSQL은 테이블에 대한 질의 결과를 반환하기 위한 '행 반환 함수'를 지원한다.

실행권한은 함수 작성자 및, 실행자 모두에게 있다.


PostgreSQL 설치 순서

▶ PostgreSQL 다운로드 사이트로 이동

 

PostgreSQL: Downloads

Downloads PostgreSQL Downloads PostgreSQL is available for download as ready-to-use packages or installers for various platforms, as well as a source code archive if you want to build it yourself. Packages and Installers Select your operating system family

www.postgresql.org

▶ Windows 로 이동

▶ 'Download the Installer' 클릭

▶ 설치를 희망하는 Version 과 OS 선정 후 'Download' 버튼클릭

▶ 'Next' 버튼 클릭

▶ PostgreSQL 설치 경로 지정

▶ 'Next' 버튼 클릭

▶ 설치 하고자 하는 컴포넌트 선정

▶ 'Next' 버튼 클릭

▶ Data 설치 경로 지정

▶ 'Next' 버튼 클릭

▶ 계정 패스워드 설정 (기본값 ID : postgres)

▶ 'Next' 버튼 클릭

▶ Port 지정(기본값 : 5432)

▶ 'Next' 버튼 클릭

▶ Locale 선정

▶ 'Next' 버튼 클릭

▶ 'Next' 버튼 클릭

▶ 'Next' 버튼 클릭

▶ 설치 진행...(시간 소요됨)

▶ 체크박스를 해제

▶ 'Finish' 버튼 클릭

▶ SQL Shell (psql) 실행

▶ Server, Database, Port, Username 엔터키 입력

▶ postgres 사용자의 암호 -> 상위에서 지정한 암호로 설정

▶ SELECT version();  -> 명령어 실행

▶ 아래와 같은 결과가 출력된다면 PostgreSQL 설치 완료!!!

반응형

+ Recent posts