Unique index

μœ λ‹ˆν¬λŠ” μΈλ±μŠ€λΌκΈ°λ³΄λ‹€λŠ” μ œμ•½ 쑰건에 가깝닀고 λ³Ό 수 μžˆλ‹€.

μœ λ‹ˆν¬λŠ” ν…Œμ΄λΈ”μ΄λ‚˜ μΈλ±μŠ€μ— 같은 값이 2개 이상 μ €μž₯될 수 μ—†μŒμ„ μ˜λ―Έν•˜λŠ”λ°, MySQLμ—μ„œλŠ” 인덱슀 없이 μœ λ‹ˆν¬ μ œμ•½λ§Œ μ„€μ •ν•  방법이 μ—†λ‹€. μœ λ‹ˆν¬ μΈλ±μŠ€μ—μ„œλ„ 2개 μ΄μƒμ˜ NULL이 지정될 수 μžˆλ‹€.

  • MySQL은 μœ λ‹ˆν¬ μ œμ•½ 쑰건을 μ„€μ •ν•˜λ©΄ ν•΄λ‹Ή μ»¬λŸΌμ— λŒ€ν•΄ μžλ™μœΌλ‘œ μœ λ‹ˆν¬ 인덱슀λ₯Ό μƒμ„±ν•œλ‹€.

InnoDB ν…Œμ΄λΈ”μ˜ PKλŠ” ν΄λŸ¬μŠ€ν„°λ§ ν‚€μ˜ 역할도 ν•˜λ―€λ‘œ μœ λ‹ˆν¬ μΈλ±μŠ€μ™€λŠ” 근본적으둜 λ‹€λ₯΄λ‹€.

μœ λ‹ˆν¬ μΈλ±μŠ€μ™€ 일반 세컨더리 인덱슀 비ꡐ

μœ λ‹ˆν¬ μΈλ±μŠ€μ™€ μœ λ‹ˆν¬ν•˜μ§€ μ•Šμ€ 세컨더리 μΈλ±μŠ€λŠ” ꡬ쑰상 μ•„λ¬΄λŸ° 차이점이 μ—†λ‹€. 그럼 μ–΄λ–€ 차이가 μžˆλŠ”κ°€?

인덱슀 읽기

μœ λ‹ˆν¬ μΈλ±μŠ€κ°€ λΉ λ₯΄λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 사싀이 μ•„λ‹ˆλ‹€. μœ λ‹ˆν¬ μΈλ±μŠ€λŠ” 1건만 읽으면 λ˜μ§€λ§Œ μœ λ‹ˆν¬ν•˜μ§€ μ•Šμ€ 세컨더리 μΈλ±μŠ€μ—μ„œλŠ” λ ˆμ½”λ“œλ₯Ό ν•œ 번 더 읽어야 ν•΄μ„œ λŠλ¦¬λ‹€κ³  μ–˜κΈ°ν•œλ‹€.

ν•˜μ§€λ§Œ 일반 세컨더리 μΈλ±μŠ€μ—μ„œ ν•œ 번 더 ν•˜λŠ” μž‘μ—…μ€ disk I/Oκ°€ μ•„λ‹ˆλΌ CPUμ—μ„œ μ»¬λŸΌκ°’μ„ λΉ„κ΅ν•˜λŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— μ„±λŠ₯상 영ν–₯이 거의 μ—†λ‹€.

μœ λ‹ˆν¬ν•˜μ§€ μ•Šμ€ 세컨더리 μΈλ±μŠ€λŠ” 쀑볡을 ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— 읽어야 ν•  λ ˆμ½”λ“œκ°€ λ§Žμ•„μ„œ 느린 것이지, 인덱슀 자체의 νŠΉμ„± λ•Œλ¬Έμ— 느린 것이 μ•„λ‹ˆλ‹€. 읽어야 ν•  λ ˆμ½”λ“œκ°€ 1κ°œλƒ 2개 μ΄μƒμ΄λƒμ˜ 차이만 μžˆμ„ 뿐, κ±΄μˆ˜κ°€ κ°™λ‹€λ©΄ μ„±λŠ₯은 λ˜‘κ°™λ‹€.

인덱슀 μ“°κΈ°

INSERT ν˜Ήμ€ μ»¬λŸΌκ°’μ΄ λ³€κ²½λ˜λŠ” κ³Όμ •μ—μ„œ 인덱슀 μ“°κΈ° μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

그런데 μœ λ‹ˆν¬ 인덱슀의 킀값을 μ“Έ λ•ŒλŠ” μ€‘λ³΅λœ 값이 μžˆλŠ”μ§€ μ—†λŠ”μ§€ μ²΄ν¬ν•˜λŠ” 과정이 ν•œ 번 더 ν•„μš”ν•˜λ‹€. κ·Έλž˜μ„œ μœ λ‹ˆν¬ν•˜μ§€ μ•Šμ€ 세컨더리 인덱슀의 쓰기보닀 λŠλ¦¬λ‹€.

MySQLμ—μ„œλŠ” μœ λ‹ˆν¬ μΈλ±μŠ€μ—μ„œ 쀑볡 값을 체크할 λ•Œ 읽기 μž κΈˆμ„ μ‚¬μš©ν•˜κ³ , μ“°κΈ°λ₯Ό ν•  λ•ŒλŠ” μ“°κΈ° μž κΈˆμ„ μ‚¬μš©ν•˜λŠ”λ° 이 κ³Όμ •μ—μ„œ λ°λ“œλ½μ΄ μ•„μ£Ό λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•œλ‹€.

λ˜ν•œ InnoDB μŠ€ν† λ¦¬μ§€ μ—”μ§„μ—λŠ” 인덱슀 ν‚€μ˜ μ €μž₯을 버퍼링 ν•˜κΈ° μœ„ν•΄ 체인지 버퍼가 μ‚¬μš©λ˜μ–΄ 인덱슀의 μ €μž₯μ΄λ‚˜ λ³€κ²½ μž‘μ—…μ΄ μƒλ‹Ήνžˆ 빨리 μ²˜λ¦¬λ˜μ§€λ§Œ, μœ λ‹ˆν¬ μΈλ±μŠ€λŠ” λ°˜λ“œμ‹œ 쀑볡 체크λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— μž‘μ—…μ„ λ²„νΌλ§ν•˜μ§€ λͺ»ν•œλ‹€. 이 λ•Œλ¬Έμ— μœ λ‹ˆν¬ μΈλ±μŠ€λŠ” 일반 세컨더리 μΈλ±μŠ€λ³΄λ‹€ λ³€κ²½ μž‘μ—…μ΄ 더 λŠλ¦¬λ‹€.

μœ λ‹ˆν¬ 인덱슀 μ‚¬μš© μ£Όμ˜μ‚¬ν•­

μ„±λŠ₯이 더 μ’‹μ•„μ§ˆ 것이라고 λΆˆν•„μš”ν•œ μœ λ‹ˆν¬ 인덱슀 생성을 μžμ œν•΄μ•Ό ν•œλ‹€. 그리고 ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—μ„œ 같은 μ»¬λŸΌμ— μœ λ‹ˆν¬ μΈλ±μŠ€μ™€ 일반 인덱슀λ₯Ό μ€‘λ³΅ν•΄μ„œ 생성해 λ‘” κ²½μš°κ°€ μžˆλŠ”λ°, MySQL의 μœ λ‹ˆν¬ μΈλ±μŠ€λŠ” 일반 λ‹€λ₯Έ μΈλ±μŠ€μ™€ 같은 역할을 ν•˜λ―€λ‘œ μ€‘λ³΅ν•΄μ„œ 생성할 ν•„μš”λŠ” μ—†λ‹€.

μœ„ ν…Œμ΄λΈ”μ—μ„œ 이미 nick_nameμ΄λΌλŠ” μ»¬λŸΌμ— μœ λ‹ˆν¬ 인덱슀인 ux_nickname이 있기 λ•Œλ¬Έμ— ix_nickname 인덱슀λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 것이닀. 이미 μœ λ‹ˆν¬ μΈλ±μŠ€λ„ 일반 세컨더리 μΈλ±μŠ€μ™€ 같은 역할을 λ™μΌν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.

가끔 같은 μ»¬λŸΌμ— λŒ€ν•΄ PK와 μœ λ‹ˆν¬ 인덱슀λ₯Ό λ™μΌν•˜κ²Œ μƒμ„±ν•œ κ²½μš°λ„ μžˆλŠ”λ° 이 λ˜ν•œ 쀑볡이닀.

μœ λ‹ˆν¬ μΈλ±μŠ€λŠ” 쿼리 μ‹€ν–‰ κ³„νšμ΄λ‚˜ ν…Œμ΄λΈ” νŒŒν‹°μ…˜μ— λ―ΈμΉ˜λŠ” 영ν–₯이 μ‘΄μž¬ν•œλ‹€.

결둠적으둜 μœ μΌμ„±μ΄ λ°˜λ“œμ‹œ 보μž₯돼야 ν•˜λŠ” μ»¬λŸΌμ—λŠ” μœ λ‹ˆν¬ 인덱슀λ₯Ό μƒμ„±ν•˜λ˜, λΆˆν•„μš”ν•˜λ‹€λ©΄ 일반 세컨더리 인덱슀λ₯Ό μƒμ„±ν•˜λŠ” 방법을 κ³ λ €ν•΄μ•Ό ν•œλ‹€.

Last updated