MySQL

오픈소스 관계형 데이터베이스(RDBMS)입니다.


특징

특징설명
무료오픈소스 (상용 버전도 있음)
SQL 사용표준 SQL 지원
빠름읽기 성능 좋음
대중적가장 많이 쓰이는 DB 중 하나

사용 예

-- 테이블 생성
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100)
);

-- 데이터 삽입
INSERT INTO users (name, email) VALUES ('철수', 'cs@email.com');

-- 조회
SELECT * FROM users WHERE name = '철수';

다른 RDBMS와 비교

DB특징
MySQL무료, 빠름, 대중적
PostgreSQL무료, 기능 풍부, 표준 준수
Oracle유료, 대기업용, 강력한 기능
SQL Server유료, Microsoft, Windows 친화

누가 쓰나

Facebook, Twitter, YouTube, Netflix, Uber...

스타트업부터 대기업까지 널리 사용됩니다.


MySQL이 데이터를 찾는 세 가지 방식입니다.

1. 인덱스 레인지 스캔

범위를 정해서 필요한 부분만 읽습니다. 가장 빠릅니다.

SELECT * FROM users WHERE age BETWEEN 20 AND 30;
인덱스 (age):
[10] → [15] → [20] → [25] → [30] → [35] → [40]
              ↑ 시작          ↑ 끝
              └── 이 범위만 읽음 ──┘

2. 인덱스 풀 스캔

인덱스 전체를 읽습니다. 복합 인덱스

-- 복합 인덱스: (A, B, C)
CREATE INDEX idx ON users(A, B, C);

-- A 없이 B로 검색
SELECT * FROM users WHERE B = 'hello';
인덱스가 A로 정렬되어 있어서 B만으로는 범위 특정 불가
→ 인덱스 전체를 읽으면서 B='hello' 찾음

테이블 전체보다는 인덱스가 작으니까 풀 테이블 스캔보다는 낫습니다.


3. 루스 인덱스 스캔

필요한 부분만 듬성듬성 읽습니다.

SELECT dept, MAX(salary) FROM employees GROUP BY dept;
인덱스 (dept, salary):
[개발팀, 3000]
[개발팀, 4000]
[개발팀, 5000] ← MAX만 필요, 여기만 읽음
[디자인팀, 2500]
[디자인팀, 3500]
[디자인팀, 4500] ← MAX만 필요, 여기만 읽음

각 그룹의 첫 번째나 마지막 값만 필요하면 중간은 건너뜁니다.


비교

스캔 방식읽는 범위사용 상황
인덱스 레인지필요한 범위만WHERE 조건이 인덱스와 맞을 때
인덱스 풀인덱스 전체인덱스 순서와 안 맞을 때
루스 인덱스듬성듬성GROUP BY, MIN, MAX

추가: 랜덤 IO vs 순차 IO

인덱스 레인지 스캔 후 실제 데이터 읽기:

인덱스 리프: [PK=5] → [PK=100] → [PK=3]
                ↓         ↓         ↓
데이터 위치:  5번 → 100번 → 3번  (여기저기 점프 = 랜덤 IO)
풀 테이블 스캔:

테이블: 1번 → 2번 → 3번 → 4번 → ...  (순서대로 = 순차 IO)

그래서 데이터의 20-25% 이상을 읽어야 하면, 랜덤 IO보다 순차 IO가 빨라서 풀 테이블 스캔이 나을 수 있습니다.

CSLOG에서 보기