#6 Indexes

#6.0 Introduction

๋А๋ฆฐ ์ฟผ๋ฆฌ ์ž‘์—… ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด์ฃผ๋Š” ์ธ๋ฑ์Šค

#6.1 Table Scans

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฌด์–ธ๊ฐ€ ์ฐพ๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ํ•˜๋‚˜์”ฉ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ์˜๋ฏธ

query plan - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ SQL ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณ„ํš

EXPLAIN QUERY PLAN ~~

๋ฅผ ํ™œ์šฉํ•ด INDEX ํšจ๊ณผ ํ™•์ธ. ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹  INDEX ์‚ฌ

#6.2 Create INDEX

๋ฐ์ดํ„ฐ - ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์™€ ๋น„์Šทํ•œ ๊ตฌ์กฐ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Œ

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

ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ. ํ•„์š”์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

SELECT *
FROM movies
WHERE director = 'Guy Ritchie';

CREATE INDEX idx_director ON movies (director);
DROP INDEX idx_director 

#6.4 B+ Trees

ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ ํ‚ค์— ์˜ํ•ด ์‹๋ณ„๋˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ํšจ์œจ์  ์‚ฝ์ž…, ๊ฒ€์ƒ‰, ์‚ญ์ œ๋ฅผ ํ†ตํ•ด ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ

root node : ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ

leaf node : ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ

sibling : ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ (ํ˜•์ œ ๋…ธ๋“œ)

#6.5 Leaf Nodes

์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋…ธ๋“œ, ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๋ฉฐ, ํ•ด๋‹น ๋…ธํŠธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

#6.7 Indexes and Keys

SQLite, MySQL ๋“ฑ์˜ DB๋Š” Primary Key๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •๋ ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ

๋”ฐ๋ผ์„œ Primary Key๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฆ„ > Unique ๊ฐ’์„ Primary key๋กœ ์„ค์ •ํ•˜๋Š” ์ด์œ 

SQLite์˜ ๊ฒฝ์šฐ ์ž๋™์ ์œผ๋กœ rowid๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ MySQL์€ ํŠน์ •ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

#6.8 Multi Column Indexes

๋‹ค์ค‘ Column์— index ์ƒ์„ฑ, ๋‹ค์ค‘ ์กฐ๊ฑด

SELECT title
FROM movies
WHERE release_date = 2022 AND rating = 7 AND revenue > 100;

CREATE INDEX idx ON movies (release_date, rating, revenue);
-- ๊ฐ€์žฅ ๋งŽ์ด ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•ญ๋ชฉ, = ํ™œ์šฉ ์กฐ๊ฑด์„ ์•ž์— ๋‘๊ณ 
-- ๋ฒ”์œ„ ์กฐ๊ฑด์„ ๋’ค์— ๋‘์–ด์•ผ ํ•จ

DROP INDEX idx;

#6.9 Covering Indexes

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํŠน์ • ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, ์ฟผ๋ฆฌ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์Šค ์ž์ฒด์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ธ๋ฑ์Šค. ๋ณธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์„ฑ๋Šฅ ํ–ฅ์ƒ๋จ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์—…๋ฐ์ดํŠธ๋‚˜ ์‚ฝ์ž…์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์ง€์–‘ํ•ด์•ผ ํ•จ

SELECT title
FROM movies
WHERE rating > 7;

CREATE INDEX idx ON movies (rating);
CREATE INDEX idx ON movies (rating, title);

DROP INDEX idx

#6.10 When To Use Indexes

  • WHERE, ORDER BY, JOIN์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ

  • ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ (๋†’์€ ์นด๋””๋„๋ฆฌํ‹ฐ)

  • ํ…Œ์ด๋ธ”์ด ํด ๊ฒฝ์šฐ

  • ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

  • ๊ณผ๋„ํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ธˆ์ง€ (์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ์ž‘์—…์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Œ) > ๋ชจ๋“  ๋‹จ์ผ ์—ด๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š” ์—†์Œ (์ธ๋ฑ์Šค๋Š” ๊ณต์งœ๊ฐ€ ์•„๋‹˜)

  • ์ž‘์—… ์™„๋ฃŒ ํ›„ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ•˜๊ธฐ

  • ์—ฌ๋Ÿฌ ์—ด์„ ํ•จ๊ป˜ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ ์—ด์ด๋‚˜ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์‚ฌ์šฉ

  • ๊ฐ€๋Šฅํ•˜๋ฉด ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์‚ฌ์šฉ (๋น„์šฉ ์ €๋ ด) > ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋Š” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฑฐ๋Œ€ํ•˜์ง€ ์•Š์Œ

  • ์ž‘์€ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ

  • ์—…๋ฐ์ดํŠธ ๋นˆ๋„ ๊ณ ๋ ค > ๋ณ€๊ฒฝ์ด ์žฆ์€ ์—ด์€ ์ธ๋ฑ์Šค ๋Œ€์ƒ์ด ์•„๋‹˜

  • ํฐ ํ…์ŠคํŠธ ์—ด์€ B-ํŠธ๋ฆฌ ๋Œ€์‹  ์ „์ฒด ํ…์ŠคํŠธ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

Last updated

Was this helpful?