Home > Backend Development > ๐Ÿ“š[Backend Development] Covering Index

๐Ÿ“š[Backend Development] Covering Index
Backend Ddevelopment

โ€œ๐Ÿ“š[Backend Development] Covering Index.โ€

๐Ÿ“ Intro

Covering Index(์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค)๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ, ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ํ…Œ์ด๋ธ”(์›๋ณธ ๋ฐ์ดํ„ฐ)์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.

โœ…1๏ธโƒฃ Covering Index์˜ ํ•ต์‹ฌ ๊ฐœ๋….

1๏ธโƒฃ ์ธ๋ฑ์Šค ์Šค์บ”(Index Scan)๋งŒ์œผ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ผ๋ถ€ ์ปฌ๋Ÿผ๋งŒ ๊ฒ€์ƒ‰ํ•œ ํ›„, ์ถ”๊ฐ€์ ์œผ๋กœ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ.
  • ํ•˜์ง€๋งŒ Covering Index๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์–ด, ํ…Œ์ด๋ธ” ์กฐํšŒ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ.

2๏ธโƒฃ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”.

  • ๋””์Šคํฌ I/O ๊ฐ์†Œ : ํ…Œ์ด๋ธ”์„ ์ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ I/O ๋น„์šฉ ์ ˆ๊ฐ.
  • ์ฟผ๋ฆฌ ์†๋„ ํ–ฅ์ƒ : ์ธ๋ฑ์Šค๋งŒ ์กฐํšŒํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์ง.
  • Random I/O ๊ฐ์†Œ : ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ I/O๋ฅผ ์ตœ์†Œํ™”ํ•จ.

โœ…2๏ธโƒฃ Covering Index ๋™์ž‘ ๋ฐฉ์‹.

๐Ÿ’Ž ์˜ˆ์ œ ํ…Œ์ด๋ธ” (MySQL ๊ธฐ์ค€):

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    age INT,
    city VARCHAR(100)
);

๐Ÿ’Ž ์ผ๋ฐ˜์ ์ธ ์ธ๋ฑ์Šค ์‚ฌ์šฉ (ํ…Œ์ด๋ธ” ์กฐํšŒ ํ•„์š”)

SELECT name FROM users WHERE age = 30;
  • age ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด๋„, name ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ” ์กฐํšŒ(๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ ‘๊ทผ)๊ฐ€ ํ•„์š”ํ•จ.

๐Ÿ’Ž Covering Index ์‚ฌ์šฉ

CREATE INDEX idx_users_age_name ON users (age, name);
  • ์ธ๋ฑ์Šค(idx_users_age_name)๊ฐ€ age์™€ name ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฏ€๋กœ, ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•  ํ•„์š” ์—†์Œ.
  • ์ธ๋ฑ์Šค์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋จ.

โœ…3๏ธโƒฃ Covering Index ํ™•์ธ ๋ฐฉ๋ฒ• (MySQL)

์ฟผ๋ฆฌ๊ฐ€ Covering Index๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด EXPLAIN ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

EXPLAIN SELECT name FROM users WHERE age = 30;
  • ๐Ÿ“Œ Extra ์ปฌ๋Ÿผ์— โ€œUsing indexโ€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Covering Index๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๐Ÿš€ ๊ฒฐ๋ก 

  • โœ… Covering Index๋Š” ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ , ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•
  • โœ… ๋””์Šคํฌ I/O์™€ Random I/O๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • โœ… ์ธ๋ฑ์Šค ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ์ ˆํ•œ ์ปฌ๋Ÿผ๋งŒ ํฌํ•จํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”.