๐Ÿšindex

๊น€์ข…์™„ยท2022๋…„ 10์›” 19์ผ
0

Intro

์ฑ…์„ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋ณดํ†ต ์ฝ๊ธฐ์ „์— ๋ชฉ์ฐจ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณธ๋‹ค. ๋ชฉ์ฐจ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ฑ…์„ ์ฝ๋˜ ๋ถ€๋ถ„์ด ์–ด๋–ค ํŽ˜์ด์ง€์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ  ์ฑ…์„ 60ํผ์„ผํŠธ ์ •๋„ ์ฝ์—ˆ๋‹ค ๊ฐ€์ •ํ•˜๋ฉด ์ผ๋‹จ ์ฑ…์„ ์ ˆ๋ฐ˜ ๋ถ€ํ„ฐ ์ฝ์—ˆ๋˜ ๋ถ€๋ถ„์„ ์ฐพ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์€ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์„ ๊ฐœ์„ ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ index์ด๋‹ค.

index๋ž€?

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œ์ผœ์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ธ๋ฑ์Šค์˜ ๊ตฌ์กฐ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ •๋ ฌํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์ €์žฅ๋œ ์›๋ณธ ํ…Œ์ด๋ธ”์˜ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ธ๋ฑ์Šค๋Š” ์—ฐ๋ฝ์ฒ˜ ๋ชฉ๋ก๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž์˜ ์—ฐ๋ฝ์ฒ˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ๋‚˜์—ดํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ธ๋‹ค.

index๋ฅผ ์ ์šฉํ•  ๊ฒฝ์šฐ

์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜์–ด์„œ O(n)๋งŒํผ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฒ”์œ„๋ฅผ ๋งค๋ฒˆ ์ ˆ๋ฐ˜์”ฉ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log n)๋งŒํผ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

๋ฐ์ดํ„ฐ(entry) ๊ฐœ์ˆ˜์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•œ ๊ฒฝ์šฐ์˜ ํƒ์ƒ‰ ํšŸ์ˆ˜(์ตœ์•…์˜ ๊ฒฝ์šฐ)์ ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ํƒ์ƒ‰ ํšŸ์ˆ˜(์ตœ์•…์˜ ๊ฒฝ์šฐ
838
1007100
1,000101,000
10,0001410,000
100,00017100,000
1,000,000201,000,000

์ธ๋ฑ์Šค์˜ ์ข…๋ฅ˜

  • Clustered index

    • Clustered index๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”๋ณ„ ๊ณ ์œ  ์ธ๋ฑ์Šค์ด๋‹ค. Clustered index๋Š” ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์ฆ๊ฐ€๋œ ์ˆœ์„œ๋กœ ์ €์žฅ๋˜๋„๋ก ํ•œ๋‹ค. ์ด ์ˆœ์„œ๋Š” ํ…Œ์ด๋ธ”์ด ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๋Š” ์ˆœ์„œ์ด๊ธฐ๋„ ํ•˜๋‹ค.
    • ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ธ๋ฑ์Šค์ด๋‹ค.
    • ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • Non-Clustered index
    • Non-Clustered index๋Š” ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์˜ ํŠน์ • ํ•„๋“œ์— ๋Œ€ํ•œ ์ •๋ ฌ๋œ ์ฐธ์กฐ๋กœ ํ…Œ์ด๋ธ”์˜ ์›๋ž˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
    • ๋น„ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ Clustered index๋ณด๋‹ค ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ๋Š๋ฆฌ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ์—ด๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด non-clustered ์ธ๋ฑ์Šค์ด๋‹ค.

์ฐธ์กฐ

https://dataschool.com/sql-optimization/how-indexing-works

์ธ๋ฑ์Šค์˜ ๋‹จ์ 

  • ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ €์žฅํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ๋ฐœ์ƒํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ์ˆ˜์ •ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค์˜ ๋‹จ์ ์€ linked list์˜ ๋‹จ์ ๊ณผ ๋น„์Šทํ•ด ๋ณด์ธ๋‹ค.

์ธ๋ฑ์Šค ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ MySql ๊ธฐ์ค€

  • ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ช…๋ น์–ด
CREATE INDEX ์ธ๋ฑ์Šค ์ด๋ฆ„ ON ํ…Œ์ด๋ธ” ์ด๋ฆ„ ( ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ );
  • ์ธ๋ฑ์Šค ์ œ๊ฑฐ ๋ช…๋ น์–ด
ALTER TABLE ํ…Œ์ด๋ธ” ์ด๋ฆ„ DROP INDEX ์ธ๋ฑ์Šค ์ด๋ฆ„;
  • ์ธ๋ฑ์Šค ํ™•์ธ ๋ช…๋ น์–ด
SHOW INDEX FROM ํ…Œ์ด๋ธ” ์ด๋ฆ„

์ธ๋ฑ์Šค ์ ์šฉ ํ›„ ์†๋„ ๋น„๊ตํ•ด๋ณด๊ธฐ

์ธ๋ฑ์Šค๋ฅผ ์ ์šฉ ํ•˜์˜€๋‹ค๋ฉด ์†๋„๋ฅผ ๋น„๊ตํ•ด๋ณด๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. Mysql์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ํŠน์ • ์ฟผ๋ฆฌ๋ฌธ์—๋Œ€ํ•œ ์†๋„๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

EXPLAIN ANALYZE ์ฟผ๋ฆฌ๋ฌธ

JPA ์ฝ”ํ‹€๋ฆฐ์—์„œ index ์ ์šฉ ๋ฌธ๋ฒ•

@Entity
@Table(indexes = [Index(name = "์ธ๋ฑ์Šค ์ด๋ฆ„", columnList = "์ปฌ๋Ÿผ ์ด๋ฆ„")])
class Member(

์œ„์™€๊ฐ™์ด ์ธ๋ฑ์Šค์˜ ์ด๋ฆ„๊ณผ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ปฌ๋Ÿผ์„ ์ง€์ •ํ•˜์—ฌ JPA๋ฌธ๋ฒ•์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
๊ฐœ๋ฐœ์— ์žฌ๋ฏธ๋ฅผ ๋Š๋ผ๋ฉฐ ๊พธ์ค€ํžˆ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊น€์ข…์™„ ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€