Home > DB > ๐Ÿ’พ[Database] Covering Index๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ’พ[Database] Covering Index๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
Database Native SQL Query MySQL

โ€œ๐Ÿ’พ[Database] Covering Index๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?โ€

๐ŸŽ Intro.

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

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

  • 1. ์ผ๋ฐ˜์ ์ธ ์ธ๋ฑ์Šค ์‚ฌ์šฉ:
    • ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋จผ์ € ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ณ , ์ดํ›„ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
      • ์ด๋ฅผ โ€œ์ธ๋ฑ์Šค ๋ฃฉ์—…(Index Lookup)โ€์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • 2. Covering Index ์‚ฌ์šฉ:
    • ์ฟผ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋””์Šคํฌ I/O๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

โœ…2๏ธโƒฃ Covering Index์˜ ์กฐ๊ฑด.

  • ์ฟผ๋ฆฌ์˜ SELECT์ ˆ์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ๊ณผ WHERE, ORDER BY ๋˜๋Š” GROUP BY์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ ์ธ๋ฑ์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค๋ฅผ โ€œCovering Indexโ€๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

โœ…3๏ธโƒฃ Covering Index์˜ ์˜ˆ์ œ.

1๏ธโƒฃ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

CREATE TABLE article (
    article_id INT NOT NULL,
    board_id INT NOT NULL,
    created_at DATETIME NOT NULL,
    title VARCHAR(255),
    content TEXT,
    PRIMARY KEY (article_id)
);

2๏ธโƒฃ ์ธ๋ฑ์Šค ์ƒ์„ฑ.

CREATE INDEX idx_board_created_at ON article (board_id, created_at);

3๏ธโƒฃ Covering Index ํ™œ์šฉ ์ฟผ๋ฆฌ.

EXPLAIN
SELECT board_id, created_at
FROM article
WHERE board_id = 1
ORDER BY created_at DESC;
  • ์ธ๋ฑ์Šค ๋™์ž‘ ์„ค๋ช…:
    • ์ฟผ๋ฆฌ์—์„œ ์š”์ฒญํ•œ ์ปฌ๋Ÿผ(board_id, created_at)์ด ์ธ๋ฑ์Šค idx_board_created_at์— ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ:
      • Covering Index๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
      • MySQL์€ ํ…Œ์ด๋ธ”์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โœ…4๏ธโƒฃ Covering Index์˜ ์žฅ์ .

  • 1. ์„ฑ๋Šฅ ํ–ฅ์ƒ:
    • ์ฟผ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ธ๋ฑ์Šค์— ์ดˆํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
    • ๋””์Šคํฌ I/O๊ฐ€ ์ค„์–ด๋“ค๊ณ , ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.
  • 2. ํšจ์œจ์ ์ธ ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ:
    • ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ์•Š๊ณ , ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋” ์ ์€ ์ž์›์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 3. ํŠน์ • ์ฟผ๋ฆฌ์— ์ตœ์ ํ™” ๊ฐ€๋Šฅ:
    • ํŠน์ • ์ฟผ๋ฆฌ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ๋งŒ ํฌํ•จํ•˜์—ฌ ์„ค๊ณ„ํ•˜๋ฉด, ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ…5๏ธโƒฃ Covering Index์˜ ํ•œ๊ณ„.

  • 1. ์ธ๋ฑ์Šค ํฌ๊ธฐ ์ฆ๊ฐ€:
    • ์ธ๋ฑ์Šค์— ๋งŽ์€ ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์ธ๋ฑ์Šค ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ ์‚ฝ์ž…/์‚ญ์ œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2. ๋ชจ๋“  ์ฟผ๋ฆฌ์— ์ ์šฉ ๋ถˆ๊ฐ€๋Šฅ:
    • SELECT *์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ”์— ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ฟผ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์€ ์—ฌ์ „ํžˆ ์ผ€์ด๋ธ”์—์„œ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 3. ๋ณต์žกํ•œ ์„ค๊ณ„ ํ•„์š”:
    • ํŠน์ • ์ฟผ๋ฆฌ์— ๋งž์ถ˜ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ถ„์„์ด ํ•„์š”ํ•˜๋ฉฐ, ์ธ๋ฑ์Šค ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ…6๏ธโƒฃ Covering Index๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ.

  • 1. ์ฝ๊ธฐ(SELECT) ์ž‘์—…์ด ๋งŽ์€ ๊ฒฝ์šฐ:
    • ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 2. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:
    • ์ฟผ๋ฆฌ ํŒจํ„ด์„ ๋ถ„์„ํ•˜์—ฌ, ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ํฌํ•จํ•˜๋Š” ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • 3. ๋ฒ”์œ„ ๊ฒ€์ƒ‰๊ณผ ์ •๋ ฌ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ:
    • ์˜ˆ: ๋‚ ์งœ๋ณ„ ์ •๋ ฌ, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋ง๋œ ๊ฒฐ๊ณผ ์กฐํšŒ ๋“ฑ.

โœ…7๏ธโƒฃ Covering Inde์™€ EXPLAIN

  • EXPLAIN์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ์—์„œ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • EXPLAIN ๊ฒฐ๊ณผ์—์„œ ํ™•์ธ ๋ฐฉ๋ฒ•:
    • Extra ์—ด(Column)์— Using index๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Covering Index๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ:
EXPLAIN
SELECT board_id, created_at
FROM article
WHERE board_id = 1
ORDER BY created_at DESC;
id select_type table type key key_len ref rows Extra
1 SIMPLE article index idx_board_created_at 8 const 100 Using Index
  • ๊ฒฐ๊ณผ ํ•ด์„:
    • Extra์— Using index๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด, ์ฟผ๋ฆฌ๊ฐ€ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์ •๋ฆฌ.

  • Covering Index๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ ๋„ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.
  • ์žฅ์  : ๋””์Šคํฌ I/O ๊ฐ์†Œ, ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ.
  • ๋‹จ์  : ์ธ๋ฑ์Šค ํฌ๊ธฐ ์ฆ๊ฐ€, ๋ชจ๋“  ์ฟผ๋ฆฌ์— ์ ์šฉ ๋ถˆ๊ฐ€๋Šฅ.
  • MySQL์—์„œ EXPLAIN์œผ๋กœ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Extra์— Using index๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Covering Index๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.