Search
Duplicate

8. 인덱슀

인덱슀

λ””μŠ€ν¬ 읽기 방식

β€’
μ„±λŠ₯ νŠœλ‹μ€ μ–΄λ–»κ²Œ λ””μŠ€ν¬ IO λ₯Ό μ€„μ΄λŠλƒκ°€ 관건

HDD, SSD

β€’
DB μ„œλ²„μ—μ„œλŠ” 항상 λ””μŠ€ν¬ μž₯μΉ˜κ°€ 병λͺ©
β€’
HDD λŠ” 기계식 μ €μž₯ 맀체
β€’
SSD λŠ” μ „μžμ‹ μ €μž₯ 맀체
β—¦
κΈ°μ‘΄ HDD μ—μ„œ 데이터 μ €μž₯용 ν”Œλž˜ν„°(μ›νŒ) 을 μ œκ±°ν•˜κ³  λŒ€μ‹  ν”Œλž˜μ‹œ λ©”λͺ¨λ¦¬ μž₯μ°©
β—¦
κ·Έλž˜μ„œ κΈ°κ³„μ μœΌλ‘œ νšŒμ „μ‹œν‚¬ ν•„μš”κ°€ μ—†μ–΄μ„œ 빨리 μž…μΆœλ ₯ κ°€λŠ₯
β—¦
ν”Œλž˜μ‹œ λ©”λͺ¨λ¦¬λŠ” 전원 곡급 없어도 데이터 μ‚­μ œ X
β€’
μ΄ˆλ‹Ή 처리 횟수
β—¦
CPU 10μ–΅
β—¦
DRAM 1μ–΅
β—¦
SSD 10만
β—¦
HDD 200
β€’
순차 IO μ—μ„œλŠ” 큰 차이가 μ—†μœΌλ‚˜ 랜덀 IO μ—μ„œ 큰 차이
β€’
DB μ—μ„œλŠ” 랜덀 IO μž‘μ—… 비쀑이 λŒ€λΆ€λΆ„

랜덀 IO, 순차 IO

β€’
λ””μŠ€ν¬μ— 기둝해야 ν•  μœ„μΉ˜λ₯Ό μ°ΎκΈ° μœ„ν•΄ 랜덀 IO λŠ” N 번, 순차 IO λŠ” 1번
β€’
MySQL μ„œλ²„λŠ” κ·Έλ£Ή 컀밋, λ°”μ΄λ„ˆλ¦¬ 둜그 버퍼, InnoDB 둜그 버퍼 κΈ°λŠ₯ λ‚΄μž₯
β€’
쿼리 νŠœλ‹μ€ 랜덀 IO λ₯Ό μ€„μ΄λŠ” 것이 λͺ©μ 
β€’
랜덀 IO λ₯Ό μ€„μΈλ‹€λŠ” 것은 쿼리λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데에 κΌ­ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ 읽도둝 쿼리λ₯Ό κ°œμ„ ν•˜λŠ” 것
β€’
인덱슀 λ ˆμΈμ§€ μŠ€μΊ”μ€ 랜덀 IO, ν’€ ν…Œμ΄λΈ” μŠ€μΊ”μ€ 순차 IO

B-Tree

β€’
Balanced Tree
β€’
컬럼의 μ›λž˜ 값을 λ³€ν˜•μ‹œν‚€μ§€ μ•Šκ³  인덱싱
β€’
인덱슀 ꡬ쑰체 λ‚΄μ—μ„œ 항상 μ •λ ¬λœ μƒνƒœλ‘œ μœ μ§€
β€’
트리 ꡬ쑰의 μ΅œμƒμœ„μ— ν•˜λ‚˜μ˜ 루트 λ…Έλ“œκ°€ 쑴재, κ·Έ ν•˜μœ„μ— μžμ‹ λ…Έλ“œκ°€ λΆ™μ–΄ μžˆλŠ” ν˜•νƒœ
β€’
λ£¨νŠΈλŠ” μ΅œμƒμœ„, λ¦¬ν”„λŠ” μ΅œν•˜μœ„, λ‚˜λ¨Έμ§€λŠ” 브랜치 λ…Έλ“œ
β€’
μΈλ±μŠ€μ™€ μ‹€μ œ 데이터가 μ €μž₯된 λ°μ΄ν„°λŠ” λ”°λ‘œ 관리됨
β€’
인덱슀의 리프 λ…Έλ“œλŠ” 항상 μ‹€μ œ 데이터 λ ˆμ½”λ“œλ₯Ό μ°Ύμ•„κ°€κΈ° μœ„ν•œ μ£Όμ†Ÿκ°’
β€’
InnoDB μ—μ„œλŠ” 프라이머리 ν‚€κ°€ μ•„λ‹Œ 인덱슀둜 검색 μ‹œΒ μΈλ±μŠ€ -> PK 인덱슀 -> 데이터 λ ˆμ½”λ“œΒ μˆœμœΌλ‘œ κ²€μƒ‰λœλ‹€.

인덱슀 λ ˆμΈμ§€ μŠ€μΊ”

β€’
검색해야 ν•  인덱슀의 λ²”μœ„κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•˜λŠ” 방식

인덱슀 ν’€ μŠ€μΊ”

ν΄λŸ¬μŠ€ν„°λ§ 인덱슀

β€’
ν΄λŸ¬μŠ€ν„°λ§ μΈλ±μŠ€λŠ” InnoDB μ—μ„œλ§Œ μ§€μ›λœλ‹€.
β€’
프라이머리 ν‚€μ—λ§Œ 적용됨
β€’
PK 값이 λΉ„μŠ·ν•œ λ ˆμ½”λ“œλΌλ¦¬ λ¬Άμ–΄μ„œ μ €μž₯
β€’
PK 값에 μ˜ν•΄ λ ˆμ½”λ“œμ˜ μ €μž₯ μœ„μΉ˜κ°€ κ²°μ •
β€’
PK 값이 λ³€κ²½λ˜λ©΄ λ ˆμ½”λ“œμ˜ 물리적 μ €μž₯ μœ„μΉ˜κΉŒμ§€ λ°”λ€Œμ–΄μ•Ό 함
β€’
ꡬ쑰 μžμ²΄λŠ” 일반 B Tree 와 λΉ„μŠ·
β€’
λ‹€λ₯Έ 점은 리프 λ…Έλ“œμ— λ ˆμ½”λ“œμ˜ λͺ¨λ“  칼럼이 같이 μ €μž₯λ˜μ–΄ 있음
β€’
PK κ°€ 없을 경우
1.
not null μ˜΅μ…˜μ˜ unique index 쀑 첫 번째 인덱슀λ₯Ό ν΄λŸ¬μŠ€ν„°λ§ ν‚€λ‘œ 선택
2.
1λ²ˆλ„ μ—†μœΌλ©΄ μžλ™μœΌλ‘œ μœ λ‹ˆν¬ 값을 가지도둝 μ¦κ°€λ˜λŠ” μ»¬λŸΌμ„ λ‚΄λΆ€μ μœΌλ‘œ μΆ”κ°€ ν›„ ν΄λŸ¬μŠ€ν„°λ§ ν‚€λ‘œ 선택
β—¦
μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœ X
β—¦
쿼리 λ¬Έμž₯에 λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš© λΆˆκ°€
β—¦
ν˜œνƒ X
β—¦
κ°€λŠ₯ν•˜λ‹€λ©΄ PK λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μƒμ„±ν•˜μž

세컨더리 인덱슀

β€’
InnoDB ν…Œμ΄λΈ”μ˜ λͺ¨λ“  세컨더리 μΈλ±μŠ€λŠ” ν•΄λ‹Ή λ ˆμ½”λ“œκ°€ μ €μž₯된 μ£Όμ†Œκ°€ μ•„λ‹Œ PK 값을 μ €μž₯ν•˜λ„λ‘ κ΅¬ν˜„λ¨
β€’
μ˜ˆμ‹œ)
β—¦
auto_increment PKκ°€ 있고 name μ»¬λŸΌμ— index κ°€ 적용된 경우
β—¦
select * from member where name='eden' 이면 name 인덱슀λ₯Ό κ²€μƒ‰ν•΄μ„œ λ ˆμ½”λ“œμ˜ PK 값을 ν™•μΈν•˜κ³  PK 인덱슀λ₯Ό κ²€μƒ‰ν•΄μ„œ μ΅œμ’… λ ˆμ½”λ“œ κ°€μ Έμ˜΄

ν΄λŸ¬μŠ€ν„°λ§ 인덱슀 주의 사항

β€’
PK ν‚€μ˜ 크기
β—¦
λͺ¨λ“  세컨더리 μΈλ±μŠ€κ°€ PK λ₯Ό ν¬ν•¨ν•˜κΈ°λ•Œλ¬Έ
β€’
κ°€λŠ₯ν•˜λ‹€λ©΄ auto-increment λ³΄λ‹€λŠ” 업무적인 컬럼으둜 생성

μœ λ‹ˆν¬ 인덱슀

β€’
μœ λ‹ˆν¬ μΈλ±μŠ€μ™€ 세컨더리 μΈλ±μŠ€λŠ” ꡬ쑰적으둜 차이 X
β€’
ν•˜λ‚˜μ˜ 값을 κ²€μƒ‰ν•˜λŠ” 경우, μœ λ‹ˆν¬ μΈλ±μŠ€μ™€ 세컨더리 μΈλ±μŠ€μ—μ„œ μ‚¬μš©λ˜λŠ” μ‹€ν–‰ κ³„νšμ€ λ‹€λ₯Έλ° 크게 μ°¨μ΄λŠ” μ—†λ‹€.
β€’
μƒˆλ‘œμš΄ λ ˆμ½”λ“œκ°€ insert λ˜κ±°λ‚˜ 인덱슀 컬럼의 값이 λ³€κ²½λ˜λŠ” 경우 μ€‘λ³΅λœ 값이 μžˆλŠ”μ§€ μ—†λŠ”μ§€ μ²΄ν¬ν•˜λŠ” 과정이 ν•œ 단계 더 ν•„μš”ν•΄μ„œ λŠλ¦¬λ‹€.
β€’
μœ λ‹ˆν¬ μΈλ±μŠ€μ—μ„œ μ€‘λ³΅λœ 값을 체크할 λ•ŒλŠ” 읽기 잠금, μ“°κΈ° ν•  λ•ŒλŠ” μ“°κΈ° μž κΈˆν•˜λŠ” 이 κ³Όμ •μ—μ„œ λ°λ“œλ½μ΄ 자주 λ°œμƒ

μ™Έλž˜ν‚€

β€’
μ™Έλž˜ν‚€ μ œμ•½μ΄ μ„€μ •λ˜λ©΄ μžλ™μœΌλ‘œ μ—°κ΄€λ˜λŠ” ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμ— 인덱슀 생성
β€’
μ™Έλž˜ν‚€ μ œμ•½μ΄ μ œκ±°λ˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ μƒμ„±λœ 인덱슀 μ‚­μ œ λΆˆκ°€

λŒ€κΈ° μƒνƒœμ— λΉ μ§€λŠ” 경우

β€’
team
id
name
1
morak
2
sokdak
β€’
member
id
team_id
name
1
1
eden
# session 1 start transaction; update team set name='mo-rak' where id=1; # id = 1 인 λ ˆμ½”λ“œμ— μ“°κΈ° 락 # session 2 start transaction; update member set team_id=1 where id=1; # λŒ€κΈ°μ€‘ # μ™Έλž˜ν‚€ μ œμ•½ μ‘°κ±΄λ•Œλ¬Έμ— ν•΄λ‹Ή team_id κ°€ μœ νš¨ν•œμ§€ ν™•μΈν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— 읽으러 감. κ·Έλž˜μ„œ λŒ€κΈ°μ€‘ update member set team_id=2 where id=1; # query OK # team_id = 1 λ ˆμ½”λ“œμ—λ§Œ κ±Έλ €μžˆκΈ°λ•Œλ¬Έ
SQL
볡사