DB Index

ํƒ€๋ฏธยท2020๋…„ 10์›” 3์ผ
0

Index๋ž€?

Index๋Š” RDBS์—์„œ ์กฐํšŒํ•  ๋•Œ ์ƒ๊ธฐ๋Š” full scan ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

select * from member where userName = 'ํƒ€๋ฏธ';

๋ผ๋Š” ๋ฌธ์ด ์žˆ์„ ๋•Œ, table์„ full scanํ•œ๋‹ค.
๋ฉค๋ฒ„ row๊ฐ€ 1000๊ฐœ๋ผ๋ฉด? 10000๊ฐœ๋ผ๋ฉด? ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•  ๊ฒƒ์ด๋‹ค.

๋ฐฐ๊ฒฝ์ง€์‹

  • ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ์•ฝ mySQL innoDB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋ฏธ indexing์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค.
  • innoDB๋Š” pk๋ฅผ ๊ธฐ์ค€์œผ๋กœ indexingํ•œ๋‹ค.
    • ๋งŒ์•ฝ pk๊ฐ€ ์—†๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ, ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ biggint๋ณด๋‹ค ํฌ๋‹ค๊ณ  ํ•˜๋‹ˆ pk๋Š” ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค!
    • clusted index๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

Index ์‚ฌ์šฉํ•˜๊ธฐ

  1. ๊ธฐ์กด ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค ์ถ”๊ฐ€

    ALTER TABLE table_name ADD INDEX(keyword(20))
  2. ํ…Œ์ด๋ธ” ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ธ๋ฑ์Šค ์ถ”๊ฐ€

    CREATE TABLE table_name (
      keyword varchar(20),
      INDEX(keyword(20))
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    

DB์˜ ์ธ๋ฑ์Šค์—์„œ ์“ฐ์ด๋Š” ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด์ง„ํŠธ๋ฆฌ , ํ•ด์‹œ๊ฐ€ ์žˆ๋‹ค.
์ด์ง„ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฏธ๋ฆฌ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ๋‚˜ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋‘˜์ˆ˜๋Š” ์—†๋‹ค.
ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ์™€ ๋ณ„๊ฐœ๋กœ ์ธ๋ฑ์Šค์šฉ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ ์ด๋•Œ ์ธ๋ฑ์Šค๋“ค์„ ์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ๋œ๋‹ค.

Index scan ๋ฐฉ์‹

  • index range scan : ์–ด๋–ค ์‹œ์ž‘์  ๋ถ€ํ„ฐ ํŠน์ • ๋ฒ”์œ„๋ฅผ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹
  • index full scan
  • index skip scan
  • index fast full scan

์–ด๋–ค ์ปฌ๋Ÿผ์„ Index๋กœ ์ง€์ •ํ• ๊นŒ?

  1. where์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ
  2. ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ (์ค‘๋ณต๋„๊ฐ€ ๋‚ฎ์€) ์ปฌ๋Ÿผ
    ์ค‘๋ณต๋„ โฌ‡ ์นด๋””๋„๋ฆฌํ‹ฐ โฌ† : ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ
    ์ค‘๋ณต๋„ โฌ† ์นด๋””๋„๋ฆฌํ‹ฐ โฌ‡ : ์„ฑ๋ณ„
    ์นด๋””๋„๋Ÿฌํ‹ฐ

    ์ถœ์ฒ˜: ๊ฐ“์กธ๋‘๋‹˜ ๋ธ”๋กœ๊ทธ
    ์ค‘๋ณต๋„๊ฐ€ ๋†’์€ (์„ฑ๋ณ„)๋กœ indexing์„ ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ๋˜ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋‚ฎ์•„์ง„๋‹ค.
  3. order by ๋นˆ๋„๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ
    index table์€ index๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  4. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ์ค‘๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋•Œ ์ˆœ์„œ๋Š” ์ค‘๋ณต๋„๊ฐ€ ๋‚ฎ์€ ์ปฌ๋Ÿผ์ด ์•ž์— ์žˆ๋Š” ๊ฒŒ ์ข‹๋‹ค.
  • (์ถœ์ฒ˜) ๊ฒฐํ•ฉ์ธ๋ฑ์Šค์—์„œ ์ปฌ๋Ÿผ์˜ ๋ถ„๋ณ„๋ ฅ(์ค‘๋ณต๋„)๊ณผ ์„ ๋‘ ์œ„์น˜ ์—ฌ๋ถ€๋Š” ์ƒ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋ถ„๋ณ„๋ ฅ์ด ๋‚ฎ์€ ์ปฌ๋Ÿผ์ด ์„ ๋‘์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ์ด index skip scan ์ธก๋ฉด์—์„  ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๋ณ„๋„์˜ ์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
  • insert/update/delete ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์•„์ง.
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, index table์„ ๋‹ค์‹œ sortingํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๐Ÿค” index column์„ updateํ•ด๋„ sortingํ• ๊นŒ? ๋‹น๊ทผ
  • ์†์ต๋ถ„๊ธฐ์ ์ด ์กด์žฌํ•œ๋‹ค.
    • ๋ถ„ํฌ๋„๊ฐ€ 10%~15% ์ด์ƒ์ด๋ฉด full table scan์ด ์œ ๋ฆฌํ•˜๋‹ค
      ๋ถ„ํฌ๋„ = 1/์ปฌ๋Ÿผ ๊ฐ’์˜ ์ข…๋ฅ˜
    • (๐Ÿ™‹โ€๋‡Œํ”ผ์…œ) indexing์œผ๋กœ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†๋‹ค๋ฉด ๋˜ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๊ณ  ๊ฒฐ๊ตญ ์ถ”๊ฐ€์ ์œผ๋กœ index table๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์•„์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
    • ใ„ด์š”๊ฒƒ์€ index๋ฅผ ์ž˜๋ชป ๊ฑธ์—ˆ์„ ๋•Œ์ด๊ณ , ๊ทธ ์™ธ์—๋„ I/O ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
      Full Scan์„ ํ•  ๋•Œ๋Š” Multiblock I/O๋กœ I/O ํšŸ์ˆ˜๊ฐ€ ์ ์€ ๋ฐ˜๋ฉด, index๋ฅผ ํ•  ๋•Œ์—๋Š” Singl Block I/O๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์กŒ์„ ๋•Œ I/O ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๋„ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์–‘ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด (์–ต ๋‹จ์œ„) index table ๊ด€๋ฆฌ ๋น„์šฉ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค full scan์ด ๋น ๋ฅด๋‹ค.

Clustered, Non Clustered

Clustered

  • (์˜ˆ) ์ฑ…์—์„œ ๋ฐ”๋กœ ํŽ˜์ด์ง€๋ฅผ ์•„๋Š” ๊ฒƒ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋…ผ ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
  • ๋ฒ”์œ„ ์กฐํšŒํ•  ๋•Œ ์ข‹๋‹ค.

Non Clustered

  • (์˜ˆ) ์ฑ…์—์„œ ๋ชฉ์ฐจ๋ฅผ ๋ณด๋Š” ๊ฒƒ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์•˜๋‹ค.
    • Index ํŽ˜์ด์ง€์€ ์ •๋ ฌ๋œ๋‹ค.
    • ์‚ฝ์ž…,์ˆ˜์ •,์‚ญ์ œํ•  ๋•Œ๋Š” Non-Clustered๊ฐ€ ํšจ์œจ์ ์ด๋‹ค.
  • ๋ฒ”์œ„ ์กฐํšŒ(Range Query)๋ฅผ ํ•  ๊ฒฝ์šฐ ๊ฑฐ์˜ ์ธ๋ฑ์Šค์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.
    (์ธ๋ฑ์Šค๋ฅผ ์•ˆํƒ„๋‹ค. Table Scan์„ ํ•˜๊ฒŒ ๋œ๋‹ค.) ์™œ์ง€?!!

๊ธฐํƒ€

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ•ด๋‹น ์ฟผ๋ฆฌ ์‹คํ–‰์‹œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•ˆํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์žˆ๋‹ค. (ex : EXPLAIN)

where ์กฐํšŒ ์ˆœ์„œ์™€ index ์ˆœ์„œ๋ฅผ ๋งž์ถœ ํ•„์š”๋Š” ์—†๋‹ค.

  • ๋‚ด๋ถ€์ ์œผ๋กœ ์•Œ์•„์„œ index ์ˆœ์„œ์— ๋งž๊ฒŒ ์žฌ๋ฐฐ์—ดํ•ด์ค€๋‹ค.
  • ํ—ˆ๋‚˜ ์œ ์˜๋ฏธํ•œ ์„ฑ๋Šฅ ์ด์Šˆ ๋…ธ๋…ธ

์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ๊ฐ’ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
where salary * 10 > 150000; (X)
where salary > 150000 / 10; (O)

์ •ํ™•ํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉ

  • ์ปฌ๋Ÿผ์ด ๋ฌธ์ž์—ด์ธ๋ฐ ์ˆซ์ž๋กœ ์กฐํšŒํ•˜๋ฉด ํƒ€์ž…์ด ๋‹ฌ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
profile
IT's ํ˜ธ๊ธฐ์‹ฌ ์ฒœ๊ตญ

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