๐Ÿ—‚๏ธ ์šฐ๋ฆฌ๋Š” ์™œ index๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ตœํ˜ธ๋นˆยท2024๋…„ 8์›” 29์ผ
0
post-thumbnail

| ์ด ๊ธ€์€ MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค index๊ฐ€ ๋ฌด์—‡์ผ๊นŒ? index๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€? ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํšจ๊ณผ์ ์ธ์ง€ ์ด์ œ๋ถ€ํ„ฐ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.




๐Ÿ˜ฏ index๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

ํ•™์ƒ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ด€๊ณ„ํ˜• DB๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฆ„์ด ์งœ์™•์ธ ํ•™์ƒ์„ ์ฐพ์œผ๋ ค๋ฉด

SELECT * FROM student WHERE name = '์งœ์™•' ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ๋งŒ์•ฝ ํ•™์ƒ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋ฐฑ๋งŒ๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด? ๊ทธ ๋ฐฑ๋งŒ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ณด๋ฉด์„œ ์งœ์™•์„ ์ฐพ์„ ๊ฒƒ์ด๋‹ค.(์ฆ‰, Full Scan์„ ํ•œ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)) ์ด๊ฒƒ์ด ๊ณผ์—ฐ ํšจ์œจ์ ์ผ๊นŒ? ๋งŒ์•ฝ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 100์–ต๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด? ํ•˜๋‚˜์”ฉ ๋ณด๋ฉด์„œ ์ฐพ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋“ค์— ์˜ํ•ด์„œ ์‹คํ–‰๋œ๋‹ค๋ฉด? ์ปดํ“จํ„ฐ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋น„ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ฒ„ํ…จ๋‚ด์งˆ ๋ชปํ•  ๊ฒƒ์ด๋‹ค.

์ถœ์ฒ˜: https://youtu.be/BIlFTFrEFOI?si=jOewqpSWUuRC67-P


์ด ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด FULL SCAN์„ ํ†ตํ•ด ์ฐพ๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ์•Š์€ ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ index๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? ํ›จ์”ฌ ๋น ๋ฅธ ์„ฑ๋Šฅ์œผ๋กœ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์ด ์ธ๋ฑ์Šค๊ฐ€ B- tree ๊ธฐ๋ฐ˜์˜ ์ธ๋ฑ์Šค๋ผ๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(logN)์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ธ๋ฑ์Šค๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠœํ”Œ๋“ค์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด, ๋น ๋ฅด๊ฒŒ ์ •๋ ฌ(order by)ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃนํ•‘(group by) ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.





๐Ÿ—‚๏ธ index๋ž€

์ธ๋ฑ์Šค๋ž€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

(MySQL InnoDB๊ธฐ์ค€)
ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋“ค์€ ์ •๋ ฌ๋˜์–ด ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ์ €์žฅ๋œ๋‹ค.ย ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จผ์ € ์ธ๋ฑ์Šค์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ๋กœ ์ด๋™ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๋งŒ์•ฝ ์ธ๋ฑ์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด DB๋ฅผ ์ˆœ์ฐจ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋“ค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ…Œ์ด๋ธ”์˜ ์กฐํšŒ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ORDER BY ๊ฐ™์ด ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…๋„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ์ฒ˜์Œ๊ณผ ๋์„ ๊ฐ€์ ธ์˜ค๋Š” MIN, MAX๋„ ๋นจ๋ฆฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜: https://youtu.be/iNvYsGKelYs?si=2B2EMtvsfOhyvc3j


ํ•˜์ง€๋งŒ, ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋œย ์ปฌ๋Ÿผ์— ์ˆ˜์ •/์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์ด ๋“ค์–ด๊ฐ€๋ฉด ์›๋ณธ ํ…Œ์ด๋ธ” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ธ๋ฑ์Šค์—๋„ ๋˜‘๊ฐ™์ด ๋ฐ˜์˜ํ•˜๊ณ  ์ •๋ ฌ์„ ํ•ด์ค˜์•ผ ํ•ด์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ INSERT, DELETE, UPDATE ๊ฐ™์€ DML ์ž‘์—…์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

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

์ฐธ๊ณ ๋กœ, ๊ธฐ๋ณธํ‚ค๋Š” index๋ฅผ ์ƒ์„ฑํ•  ํ•„์š” ์—†๋‹ค. ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.

์œ„ ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์ด ํ…Œ์ด๋ธ”์— ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด show index from tasks; ๋ฅผ ์ž…๋ ฅํ–ˆ๋”๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. ์ฐธ๊ณ ๋กœ, ์•„์ด๋””๋Š” auto increment๋กœ ์„ค์ •ํ–ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ์ธ๋ฑ์Šค๋„ ๋งŒ๋“ค์ง€ ์•Š์•˜์ง€๋งŒ id ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ PRIMARY KEY ์ธ๋ฑ์Šค(ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค)์™€ ์™ธ๋ž˜ ํ‚ค๋กœ ์ธํ•œ id ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค(columns ํ…Œ์ด๋ธ”๊ณผ์˜ ๊ด€๊ณ„)๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (MySQL ๊ธฐ์ค€)





๐Ÿ“š ์ธ๋ฑ์Šค์˜ ์œ ํ˜• ๋ฐ ์˜ˆ์‹œ

์ธ๋ฑ์Šค๋Š” ๊ตฌํ˜„ ๋ฐฉ์‹์— ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ ์ค‘ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์œ ํ˜•๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

์˜ˆ์‹œ๋Š” Claude์˜ ํž˜์„ ๋นŒ๋ ธ๋‹ค.


B-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค (B-tree Index)

  • ๊ท ํ˜• ์žกํžŒ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ RDBMS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฒ”์œ„ ๊ฒ€์ƒ‰์— ํšจ์œจ์ ์ด๋‹ค.

Ex) MySQL

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

CREATE INDEX idx_student_name ON students(name);

ํ•ด์‹œ ์ธ๋ฑ์Šค (Hash Index)

  • hash table์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋™๋“ฑ ๋น„๊ต(=)์—๋งŒ ์ตœ์ ํ™”๋˜์–ด ์žˆ๊ณ , ๋ฒ”์œ„ ๊ฒ€์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์ง€ ์•Š๋Š”๋‹ค!

Ex) MySQL - MEMORY ์—”์ง„

CREATE TABLE student_session (
    student_id INT,
    session_token VARCHAR(100),
    INDEX USING HASH (student_id)
) ENGINE = MEMORY;

ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค (Clustered Index)

  • ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์Šค ์ˆœ์„œ๋Œ€๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  • ํ…Œ์ด๋ธ”๋‹น ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฒ”์œ„ ๊ฒ€์ƒ‰์— ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.

Ex) SQL Server

CREATE TABLE student_grades (
    student_id INT PRIMARY KEY CLUSTERED,
    course_id INT,
    grade DECIMAL(3,2)
);

๋น„ํด๋Ÿฌ์Šคํ„ฐ๋“œ ์ธ๋ฑ์Šค (Non-Clustered Index)

  • ๋ฐ์ดํ„ฐ์™€ ๋ณ„๋„๋กœ ์ €์žฅ๋œ ์ธ๋ฑ์Šค ๊ตฌ์กฐ์ด๋‹ค.
  • ํ…Œ์ด๋ธ”๋‹น ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Ex) SQL Server

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

CREATE NONCLUSTERED INDEX idx_student_email ON students(email);

์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค (Covering Index)

  • ์ฟผ๋ฆฌ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ํฌํ•จํ•˜๋Š” ์ธ๋ฑ์Šค์ด๋‹ค.
  • ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค.
  • ๋””์Šคํฌ ์ฝ๊ธฐ ์ž‘์—…์ด ์ค„์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

Ex) MySQL

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    grade VARCHAR(2)
);

CREATE INDEX idx_name_grade ON students(name, grade);

์—ญ์ธ๋ฑ์Šค (Inverted Index)

  • ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ํ‚ค์›Œ๋“œ๋กœ ์ธ๋ฑ์‹ฑํ•œ๋‹ค.
  • ์ „๋ฌธ ๊ฒ€์ƒ‰์— ๋งค์šฐ ํšจ์œจ์ ์ด๋‹ค.(๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.)
  • ๋Œ€๋Ÿ‰์˜ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋‹ค.

Ex) Elasticsearch

PUT /student_essays
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "content": { "type": "text" }
    }
  }
}

Function-based ์ธ๋ฑ์Šค (ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค)

  • ์ปฌ๋Ÿผ ๊ฐ’์— ํ•จ์ˆ˜๋‚˜ ํ‘œํ˜„์‹์„ ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์‹ฑํ•œ๋‹ค.
  • ๋ณต์žกํ•œ WHERE ์ ˆ ์กฐ๊ฑด์— ์ข‹๋‹ค.

Ex) Oracle

CREATE TABLE students (
    id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50),
    last_name VARCHAR2(50)
);

CREATE INDEX idx_full_name ON students(LOWER(first_name || ' ' || last_name));





๐Ÿ’๐Ÿปโ€โ™€๏ธ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ปฌ๋Ÿผ์€?

1. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋“œ๋ฌธ ์ปฌ๋Ÿผ. DML ์ž‘์—…์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ปฌ๋Ÿผ
2. JOIN, WHERE, ORDER BY ๊ฐ™์ด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ปฌ๋Ÿผ
ORDER BY ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์—ด์€ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๊ฐ€ ์ž๋™ ์ •๋ ฌ๋๊ธฐ ๋•Œ๋ฌธ์— ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค.

3. ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต๋„๊ฐ€ ๋‚ฎ์€, ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ
์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€ํ•™์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ 'ํ•™๋…„' ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ํ•™๋…„์€ ๋ณดํ†ต 1ํ•™๋…„๋ถ€ํ„ฐ 4ํ•™๋…„๊นŒ์ง€๋กœ ์ œํ•œ๋˜๋ฏ€๋กœ ์ด๋Š” ๋งค์šฐ ๋‚ฎ์€ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ 3ํ•™๋…„ ํ•™์ƒ์„ ์ฐพ๋Š” ์ฟผ๋ฆฌ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์•ฝ 25%์ด์ƒ์„ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ์ธ๋ฑ์Šค์˜ ํšจ๊ณผ๋ฅผ ํฌ๊ฒŒ ๋ณผ ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

4. ์„ ํƒ๋„(Selectivity)๊ฐ€ ๋†’์€, ์ฆ‰ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ 10-15% ์ดํ•˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปฌ๋Ÿผ





๐Ÿ› ๏ธ ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํšจ๊ณผ์ ์ผ๊นŒ?

WHERE A = 20 AND b = 50 ๊ฐ™์€ ์กฐ๊ฑด์ธ ์ฟผ๋ฆฌ์—์„œ A๋งŒ Index๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ฒฐ๊ตญ B๊ฐ€ ๋งŒ์กฑํ•˜๋Š”์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด A๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฒฐ๊ณผ์—์„œ Full Scan์„ ํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ด ์ฟผ๋ฆฌ๊ฐ€ ํšจ๊ณผ์ ์ด๋ ค๋ฉด A์™€ B๋ฅผ ๋ฌถ์€ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค! ์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ๊ฐ™์ด ๋ฌถ์€ ์ธ๋ฑ์Šค๋ฅผ multicolumn index, composite index ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๋Š” ๋‹จ์ผ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค, Single-Column Index๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ด๋•Œ, ์žฌ๋ฐŒ๋Š” ์ ์€ (A, B)์™€ (B, A)๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ผ๋Š” ๊ฒƒ์ด๋‹ค! ๐Ÿซขย ์ธ๋ฑ์Šค๊ฐ€ โญ๏ธ์ •๋ ฌ๋œโญ๏ธ ๋ชฉ๋ก์ด๋ผ๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค๋ณด์ž. A์™€ B๋ฅผ ๋ฌถ์–ด์„œ ์ธ๋ฑ์Šค๋กœ ๋งŒ๋“ค๋•Œ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ํ• ๊นŒ? ๋ฐ”๋กœ ์™ผ์ชฝ๋ถ€ํ„ฐ์ด๋‹ค. ๋”ฐ๋ผ์„œ (A, B) ๋Š” A๋ฅผ ๊ธฐ์ค€์œผ๋กœ , (B, A) ๋Š” B๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐฐ์น˜์‹œํ‚ค๋ƒ์— ๋”ฐ๋ผ์„œ ์†๋„๊ฐ€ ์ •๋ง ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋‹ค์ค‘ ์ปฌ๋Ÿผ์„ ์ธ๋ฑ์‹ฑํ•  ๋•Œ์—๋Š” ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ์—์„œ ๋‚ฎ์€ ์ปฌ๋Ÿผ ์ˆœ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•ด์•ผ ์ข‹์€ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ (A, B) ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ WHERE B = 20 ์กฐ๊ฑด์ธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ? ๋Œ€๋ถ€๋ถ„ ์•„๋‹ˆ๋‹ค. ๐Ÿ˜…ย ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” A๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๊ณ  B๋Š” ์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ์˜ ์•ˆ์“ฐ๊ฑฐ๋‚˜ ๊ฒฐ๊ตญ Full Scan์„ ํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ์šฐ๋ฆฌ๊ฐ€ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ฃผ๋กœ DBMS์˜ optimizer(SQL์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ์ตœ์ ์˜ ์ฒ˜๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๋Š” DBMS์˜ ํ•ต์‹ฌ ์—”์ง„)๊ฐ€ ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค ์ค‘ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๊ฒƒ์„ ์„ ํƒํ•˜๋Š”๋ฐ, ํŠน์ • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…์‹œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด MySQL ๊ธฐ์ค€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ง€์ •ํ•ด๋„ optimizer๊ฐ€ ๋” ํšจ์œจ์ ์ธ๊ฒŒ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ์“ด๋‹ค๊ณ ? ํ•œ๋‹ค. ์ด๊ฑด ๊ฐ•์˜์—์„œ ๋“ค์€ ๋‚ด์šฉ์ธ๋ฐ, ์ด๋Ÿด๊ฑฐ๋ฉด ๊ฐ•์ œ ์˜ต์…˜์ด ์™œ ์žˆ๋Š”์ง€ ์˜๋ฌธ์ด๋ผ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

  • ๊ฐ•์ œ๋กœ ์ง€์ •ํ•˜๊ธฐ
    SELECT * FROM player FORCE INDEX (backnumber_idx) WHERE backnumber = 7;
  • ๊ถŒ์žฅํ•˜๋Š” ๋А๋‚Œ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ
    SELECT * FROM player USE INDEX (backnumber_idx) WHERE backnumber = 7;

๐ŸŽ ํ€ด์ฆˆ

๊ฐ ์ฟผ๋ฆฌ๋ฌธ์€ ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”? index ์ˆœ์„œ๋Œ€๋กœ 1 2 3 ์ค‘์— ๊ณ ๋ฅด์‹œ์˜ค.

์ถœ์ฒ˜: https://youtu.be/IMDH4iAQ6zM?si=RSs2N0hGzIkkVhkG


  • ๋ฌธ์ œ 1 ์ •๋‹ต
    3 (team_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)
  • ๋ฌธ์ œ 2 ์ •๋‹ต
    3
  • ๋ฌธ์ œ 3 ์ •๋‹ต
    ๋งŒ์•ฝ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 3์ธ๋ฐ, 3์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ team_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ •๋ง ์•ˆ์ข‹์„ ๊ฒƒ์ด๋‹ค.
  • ๋ฌธ์ œ 4 ์ •๋‹ต
    ๋งŒ์•ฝ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด 3์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ์กฐ๊ฑด์€ OR ์ด๊ธฐ ๋•Œ๋ฌธ์—, team_id์— ๊ด€ํ•ด์„œ๋งŒ 3์„ ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ backnumber ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ตญ full scan์„ ํ•ด์•ผํ•  ์ˆ˜ ์žˆ๋‹ค.





๐Ÿ” index๋ฅผ ๋งŒ๋“ค๊ณ  ์ •๋ง ๋น ๋ฅธ์ง€ ๊ฒ€์ฆํ•ด๋ณด์ž!

EXPLAIN ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹คํ–‰ ์ •๋ณด๋ฅผ ์•Œ์•„๋ณด์ž.
์‹ค์Šต์— ์•ž์„œ, ์ธ๋ฑ์Šค์˜ ํšจ๊ณผ๋ฅผ ๋А๋ผ๊ธฐ ์œ„ํ•ด 500๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘์—ˆ๋‹ค. ๐Ÿ˜‰


๋‹จ์ผ ์ธ๋ฑ์Šค

  • ์ง€์ • ๊ฒ€์ƒ‰

    SELECT * FROM User WHERE name = '์ตœํ•˜์€'; ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋‹ค. 1.89์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    EXPLAIN ์„ ํ†ตํ•ด ์ž์„ธํžˆ ๋ณด๋‹ˆ type์ด ALL์ด๊ณ  possible_keys, key, ref๊ฐ€ ๋ชจ๋‘ NULL์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

    ์ด์ œ, ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์‹ค์Šต์„ ์œ„ํ•ด ๊ฐ ์ปฌ๋Ÿผ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

    ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ๋˜‘๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„๋•Œ 1.89 โžก๏ธย 0.27์ดˆ๋กœ ์ค„์–ด๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค! ๐Ÿซข

    EXPLAIN ์„ ํ†ตํ•ด ์ž์„ธํžˆ ๋ณด๋‹ˆ type์ด ref๊ณ  possible_keys, key, ref๊ฐ€ ์•„๊นŒ์™€๋Š” ๋‹ฌ๋ฆฌ NULL์ด ์•„๋‹ˆ๋‹ค! ํŠนํžˆ possible_keys, key์—๋Š” ์•„๊นŒ ์ƒ์„ฑํ•œ index ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ์ด๊ฒƒ๋“ค์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” ๊ฑธ๊นŒ?

type์€ ์กฐ์ธ ์œ ํ˜•์ด๋‹ค. ref๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๋™๋“ฑ ๋น„๊ต๋กœ ์ ‘๊ทผํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.
possible_keys๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค์ด๋‹ค. 'idx_name'์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ๋‹ค๊ณ  ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.
key๋Š” ์‹ค์ œ ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค๋กœ, ํ˜„์žฌ ์ฟผ๋ฆฌ์—์„œ๋Š” 'idx_name'๊ฐ€ ์“ฐ์˜€๋‹ค. ์ด์ „์— ์ƒ์„ฑํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์ž˜ ์“ฐ์ด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
ref๋Š” ์ธ๋ฑ์Šค์™€ ๋น„๊ต๋˜๋Š” ์—ด์ด๋‚˜ ์ƒ์ˆ˜์ด๋‹ค. ์ฆ‰, ์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ค ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋Š”์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 'const'๋Š” ์ƒ์ˆ˜ ๊ฐ’๊ณผ ๋น„๊ต๋จ์„ ์˜๋ฏธํ•œ๋‹ค.

์œ„์—์„œ ๊ณ„์†ํ•ด์„œ ๋งํ–ˆ๋˜ ์ธ๋ฑ์Šค๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.(๋Œ€๋ถ€๋ถ„)๋ฅผ ๋– ์˜ฌ๋ ค๋ณด์ž! ์ด ํŠน์ง•์€ ํŠนํžˆ ORDER BY ๊ฐ™์€ ์กฐ๊ฑด์— ๋”์šฑ ํšจ๊ณผ์ ์ด๋ผ๊ณ  ํ–ˆ๋˜ ๋งŒํผ, ์ •๋ง ๊ทธ๋Ÿฐ์ง€ ์ง์ ‘ ํ•ด๋ณด์ž.


  • ์ •๋ ฌ
    SELECT * FROM User ORDER BY money DESC LIMIT 100;
    3.55์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋˜ ์กฐํšŒ๊ฐ€ 0์ดˆ ๋Œ€๋กœ ์ค„์–ด๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค! ์—ญ์‹œ ์ •๋ ฌ์— ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
    ์ด๋•Œ type์ด ์•„๊นŒ ์ง€์ • ๊ฒ€์ƒ‰ ๊ฒฝ์šฐ์™€๋Š” ๋‹ค๋ฅด๋‹ค. ref์—์„œ index๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ธ๋ฑ์Šค ์ „์ฒด๋ฅผ ์Šค์บ”ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ๋„ possible_keys๋„ NULL์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํŠน์ • WHERE ์กฐ๊ฑด์ด ์—†์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.



๋ณตํ•ฉ ์ธ๋ฑ์Šค

2๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ๋ฌถ์–ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž. ์šฐ์„  ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์˜€๊ณ , 2.20์ดˆ๊ฐ€ ๊ฑธ๋ ธ๋‹ค.

SELECT * FROM User WHERE money BETWEEN 1000000 AND 2000000 AND start_date >= '2020-01-01';

INDEX idx_money_start_date ON User(money, start_date);

๊ทธ๋ฆฌ๊ณ  ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด money์™€ start_date๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋˜‘๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ,,,,

๋”,,, ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค?? ๐Ÿ˜ฏ ์ผ๋ถ€๋Ÿฌ ํšจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ์ปฌ๋Ÿผ ์ˆœ์„œ๋„ ์ฟผ๋ฆฌ๋ž‘ ๋˜‘๊ฐ™์ด ๋ฐฐ์น˜ํ–ˆ๋Š”๋ฐ ๋” ์˜ค๋ž˜๊ฑธ๋ ค์„œ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ๋‹ค.

EXPLAIN์„ ํ†ตํ•ด ์‚ดํŽด๋ด๋„ ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ,, ๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ? ์‹ถ์–ด์„œ ์ƒ๊ฐํ•˜๋‹ค ๋จธ๋ฆฌ์†์— ์Šค์น˜๋Š” ๊ฒƒ์ด ์žˆ์—ˆ๋‹ค. ๋ฐ”๋กœ SELECT * ๋กœ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์š”์ฒญํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
์ •๋ง SELECT * ๋•Œ๋ฌธ์ธ์ง€ ๊ถ๊ธˆํ•˜์—ฌ ์ด๋ฒˆ์—๋Š” ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค(Covering Index)์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๋„๋ก id, money, start_date๋ฅผ ์š”์ฒญํ–ˆ๋‹ค.

1.92์ดˆ์—์„œ 0.04์ดˆ๋กœ ์ค„์–ด๋“ค๋ฉด์„œ ์ธ๋ฑ์Šค๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค!

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

์‹ค์Šต์„ ํ•˜๋ฉด์„œ ๋А๋‚€ ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ธ๋ฑ์Šค์˜ ๋™์ž‘์ด ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ๋ณตํ•ฉ ์ธ๋ฑ์Šค์—์„œ ๋ฐฐ์น˜ ์ˆœ์„œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์ปฌ๋Ÿผ์„ ์š”์ฒญํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„์ฃผ ์ค‘์š”ํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.





๐Ÿ€ ์ •๋ฆฌ

์ถœ์ฒ˜: https://youtu.be/NZgfYbAmge8?si=O7hFw5B7PwdlWiCg


์ธ๋ฑ์Šค๋Š” ๋งŒ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, Index๋ฅผ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ๋งŒ๋“ ๋‹ค๊ณ  ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•ด์•ผ ํšจ๊ณผ์ ์ผ์ง€ ๊ณ ๋ฏผํ•˜๊ณ , ์ฟผ๋ฆฌ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๊ณ  ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์•ˆ๋œ๋‹ค!

์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ๋“ค์–ด์žˆ๋Š” ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ๋ช‡ ๋ถ„ ์ด์ƒ ์†Œ์š”๋  ์ˆ˜ ์žˆ๊ณ  DB ์„ฑ๋Šฅ์— ์•ˆ์ข‹์€ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์‹ค์ œ ์šด์˜์ค‘์ธ ์„œ๋ฒ„์—์„œ ์ˆ˜์ฒœ๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด..? ์ตœ์•…์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค๊ฐ€ ์ž ๊น ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ˜‡ย 

์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ๋นจ๋ผ์ง€๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. table์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ๊ธˆ ์žˆ์„ ๋•Œ, ์กฐํšŒํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•  ๋•Œ๋Š” ์˜คํžˆ๋ ค full scan์ด ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ด๋ธ”๋‹น 4~5๊ฐœ ๊ถŒ์žฅ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ์ž˜ ์ƒ์„ฑํ•˜๊ณ  ์ž˜๋งŒ ์“ฐ๋ฉด ์ธ๋ฑ์Šค์€ ๋งค์šฐ ํšจ๊ณผ์ ์ด๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋Š” ํŠน์ง•์€ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์กฐ์ธ ์กฐ๊ฑด์— ์“ฐ์ด๋Š” ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋งค์นญ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ›จ์”ฌ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์„œ ์ „์ฒด์ ์ธ ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.




์ฐธ๊ณ  ์ž๋ฃŒ

index๊ฐ€ ๋ญ”์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š” (๊ฐœ๋ฐœ๋ฉด์ ‘์‹œ๊ฐ„)

[MySQL] B-Tree ์ธ๋ฑ์Šค

SQL indexing best practices | How to make your database FASTER!

DB ์ธ๋ฑ์Šค(DB index) !! ํ•ต์‹ฌ๋งŒ ๋ชจ์•„์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค !! (31๋ถ„์ด ์•„๊น์ง€ ์•Š์„ ๊ฒ๋‹ˆ๋‹ค)

[DB] ์ธ๋ฑ์Šค(Index)๋กœ DB ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์—ฌ๋ณด์ž

SQL Indexes - Definition, Examples, and Tips

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค(Index) 3๋ถ„ ์š”์•ฝ ์ •๋ฆฌ

[MYSQL] ๐Ÿ“š ์ธ๋ฑ์Šค(index) ํ•ต์‹ฌ ์„ค๊ณ„ & ์‚ฌ์šฉ ๋ฌธ๋ฒ• ๐Ÿ’ฏ ์ด์ •๋ฆฌ

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