Home > Backend Development > πŸ“š[Backend Development] SQLμ—μ„œ INDEX

πŸ“š[Backend Development] SQLμ—μ„œ INDEX
Backend Ddevelopment

β€œπŸ“š[Backend Development] SQLμ—μ„œ INDEX”

πŸ“ Intro.

  • 인덱슀(INDEX)λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 검색 μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.
  • 마치 μ±…μ˜ λͺ©μ°¨(Table of Contents)처럼, ν…Œμ΄λΈ”μ—μ„œ 데이터λ₯Ό 더 λΉ λ₯΄κ²Œ 찾을 수 μžˆλ„λ‘ λ•λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

βœ…1️⃣ 인덱슀의 μ—­ν• 

  • βœ… 검색 속도 ν–₯상 ➞ WHERE, ORDER BY, JOIN μ‹œ λΉ λ₯΄κ²Œ 데이터 쑰회 κ°€λŠ₯
  • βœ… 데이터 μ •λ ¬ μ΅œμ ν™” ➞ ORDER BY μ—°μ‚° μ‹œ μ •λ ¬ 속도 ν–₯상
  • βœ… 쀑볡 방지 ➞ UNIQUE INDEXλ₯Ό μ‚¬μš©ν•˜μ—¬ 쀑볡 데이터 μ‚½μž… 방지

πŸ“ 예제 (μΈλ±μŠ€κ°€ μ—†λŠ” 경우)

SELECT * FROM users WHERE email = 'example@email.com';
  • λ°μ΄ν„°λ² μ΄μŠ€λŠ” λͺ¨λ“  행을 ν•˜λ‚˜μ”© 검사(Full Table Scan) ν•΄μ•Ό 함
  • 데이터가 λ§Žμ„μˆ˜λ‘ 검색 속도가 느렀짐

πŸ“ 예제 (μΈλ±μŠ€κ°€ μžˆλŠ” 경우)

CREATE INDEX idx_email ON users(email);
SELECT * FROM users WHERE email = 'example@email.com';
  • 이진 탐색(Binary Search)을 톡해 λΉ λ₯΄κ²Œ 검색 κ°€λŠ₯
  • Full Table Scan을 λ°©μ§€ν•˜κ³  인덱슀λ₯Ό ν™œμš©ν•˜μ—¬ 검색 속도 ν–₯상

βœ…2️⃣ 인덱슀의 μ’…λ₯˜

1️⃣ κΈ°λ³Έ(B-Tree) 인덱슀

  • κ°€μž₯ 일반적인 인덱슀, B-Tree(Balanced Tree) ꡬ쑰 μ‚¬μš©
  • 검색, μ •λ ¬, λ²”μœ„ μ‘°νšŒμ— μ΅œμ ν™”
CREATE INDEX idx_name ON users(name);

2️⃣ UNIQUE 인덱슀

  • 쀑볡방지λ₯Ό μœ„ν•œ 인덱슀 (μ€‘λ³΅λœ κ°’ μ‚½μž… λΆˆκ°€)
CREATE UNIQUE INDEX idx_unique_email ON users(email);
INSERT INTO users (id, email) VALUES (1, 'test@email.com');
INSERT INTO users (id, email) VALUES (2, 'test@email.com'); -- ❌ 였λ₯˜ λ°œμƒ (쀑볡)

3️⃣ 볡합(Composite) 인덱슀

  • 두 개 μ΄μƒμ˜ μ»¬λŸΌμ„ κ²°ν•©ν•˜μ—¬ 인덱슀λ₯Ό 생성
  • 검색 쑰건이 μ—¬λŸ¬ 개일 λ•Œ 유용
CREATE INDEX idx_name_email ON users(name, email);
SELECT * FROM users WHERE name = 'Alice' AND email = 'alice@email.com';

4️⃣ FULLTEXT 인덱슀 (MySQL μ „μš©)

  • κΈ΄ ν…μŠ€νŠΈ 데이터(TEXT, VARCHAR)μ—μ„œ 단어 검색이 ν•„μš”ν•  λ•Œ μ‚¬μš©
  • LIKE '%keyword%'보닀 훨씬 λΉ λ₯Έ 검색 κ°€λŠ₯
CREATE FULLTEXT INDEX idx_content ON posts(content);
SELECT * FROM posts WHERE MATCH(content) AGAINST ('database');

5️⃣ HASH 인덱슀

  • μ •ν™•ν•œ μΌμΉ˜κ²€μƒ‰(Equality Search)에 μ΅œμ ν™”λ¨
  • λ²”μœ„ κ²€μƒ‰μ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŒ
CREATE INDEX idx_hash_email USING HASH ON users(email);
SELECT * FROM users WHERE email = 'test@email.com'; -- βœ… 빠름
SELECT * FROM users WHERE email = LIKE 'test%'; -- ❌ 느림 (HASH μΈλ±μŠ€λŠ” λ²”μœ„ 검색 지원 μ•ˆ 함)

βœ…3️⃣ 인덱슀의 μ„±λŠ₯ κ³ λ € 사항

  • βœ… μΈλ±μŠ€λŠ” λΉ λ₯Έ 검색을 μ œκ³΅ν•˜μ§€λ§Œ, 무쑰건 많이 λ§Œλ“ λ‹€κ³  쒋은 것은 μ•„λ‹™λ‹ˆλ‹€.
  • βœ… μΈλ±μŠ€κ°€ λ§Žμ„μˆ˜λ‘ μ‚½μž…(INSERT), μˆ˜μ •(UPDATE), μ‚­μ œ(DELETE) μ—°μ‚° 속도가 λŠλ €μ§‘λ‹ˆλ‹€.
  • βœ… 자주 μ‚¬μš©ν•˜λŠ” 쑰회 쿼리에 맞좰 ν•„μš”ν•œ 인덱슀만 μƒμ„±ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€

βœ…4️⃣ 인덱슀 μ΅œμ ν™” 및 ν™œμš©

πŸ“Œ μ‹€ν–‰ κ³„νš(EXPLAIN) 확인

인덱슀λ₯Ό 잘 ν™œμš©ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ EXPLAIN λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

EXPLAIN SELECT * FROM users WHERE email = 'test@email.com';
  • Using index ➞ 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ΅œμ ν™”λœ 쿼리
  • Using full table scan ➞ ν…Œμ΄λΈ” 전체 검색 (느림)

βœ…5️⃣ κ²°λ‘ 

  • βœ… μΈλ±μŠ€λŠ” 데이터 검색 속도λ₯Ό μ΅œμ ν™”ν•˜λŠ” 핡심 도ꡬ
  • βœ… λ„ˆλ¬΄ λ§Žμ€ μΈλ±μŠ€λŠ” 였히렀 μ„±λŠ₯을 μ €ν•˜μ‹œν‚¬ 수 있음
  • βœ… 쑰회 μ„±λŠ₯을 높이렀면 EXPLAIN을 μ‚¬μš©ν•˜μ—¬ 인덱슀 μ΅œμ ν™”