728x90
๋ฐ˜์‘ํ˜•

2์žฅ SQL ํŠœ๋‹ ์šฉ์–ด๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ

2.1.1 ๋ฌผ๋ฆฌ ์—”์ง„๊ณผ ์˜ค๋ธŒ์ ํŠธ ์šฉ์–ด

MySQL์ด๋ผ๋Š” DBMS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ์‹คํ–‰๋œ SQL ๋ฌธ์„ ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ• ๋ฐ ๊ตฌ๋ฌธ์œผ๋กœ ๊ฒ€์‚ฌ(Parser)
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฐพ์•„๊ฐ€๋Š” ์ „๋žต์  ๊ณ„ํš ์ˆ˜๋ฆฝ(Optimizer)
  3. ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์œ„ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ฐพ์•„๊ฐ„ ๋’ค ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ MySQL ์—”์ง„์œผ๋กœ ์ „๋‹ฌ.
  4. MySQL ์—”์ง„์€ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค ์ตœ์ข… ๊ฒฐ๊ณผ ์ „๋‹ฌ.

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

(InnoDB, MyISAM, Memory ๋“ฑ) ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ SQL ๋ฌธ์„ ํ† ๋Œ€๋กœ DB์— ์ €์žฅ๋œ ๋””์Šคํฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰.

์ผ๋ฐ˜์ ์œผ๋กœ ์˜จ๋ผ์ธ์ƒ์˜ ํŠธ๋žœ์žญ์…˜ ๋ฐœ์ƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” OLTP(Online Transaction Processing) ํ™˜๊ฒฝ์ด ๋Œ€๋‹ค์ˆ˜์ธ ๋งŒํผ ์ฃผ๋กœ InnoDB ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋Œ€์šฉ๋Ÿ‰ ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด MyISAM ์—”์ง„, ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์ฝ๊ธฐ ์œ„ํ•˜๋ฉด Memory ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ์‹์œผ๋กœ ์‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

-- MySQL DBMS ์‚ฌ์šฉ์ค‘์ธ ์—”์ง„ ํ™•์ธ ๋ฒ•
SELECT ENGINE, TRANSACTIONS, COMMENT
FROM information_Schema.engines;

2.1.2 SQL ํ”„๋กœ์„ธ์Šค ์šฉ์–ด

  1. SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, **ํŒŒ์„œ(Parser)**๋Š” MySQL์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑ์š”์†Œ ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ ๋‹ค.
  2. ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๊ฒ€ํ† , ํŠธ๋ฆฌ์˜ ์ตœ์†Œ ๋‹จ์œ„๋Š” >, <, = ์˜ ๊ธฐํ˜ธ ํ˜น์€ SQL ํ‚ค์›Œ๋“œ
  3. **์ „์ฒ˜๋ฆฌ๊ธฐ(PreProcessor)**๋Š” ์ƒ์„ฑ๋œ ํŠธ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ทฐ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๋Š”์ง€, ์กด์žฌํ•˜์ง€ ์•Š์€ ์—ด์„ ํฌํ•จํ•˜์ง€๋Š” ์•Š๋Š”์ง€, ์กฐํšŒ ๊ถŒํ•œ์ด ์—†๋Š” ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๋Š”์ง€ ๋“ฑ์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ.
  4. **์˜ตํ‹ฐ๋งˆ์ด์ €(Optimizer)**๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ
  5. **์—”์ง„ ์‹คํ–‰๊ธฐ(Engin Executor)**๋Š” ์ˆ˜๋ฆฝ๋œ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ํ˜ธ์ถœํ•ด ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ.
  6. ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ์—”์ง„ ์‹คํ–‰๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ.

์˜ตํ‹ฐ๋งˆ์ด์ €

DBMS์˜๋‘๋‡Œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์—ญํ• .

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

๋‹จ, ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์„ ๊ฒฝ์šฐ ๋ชจ๋“  ์‹คํ–‰ ๊ณ„ํš์„ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๊ฒƒ์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„ ํƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ตœ์ƒ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์—”์ง„ ์‹คํ–‰๊ธฐ

์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ†ตํ•ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• .

์ฝ์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ, ์กฐ์ธ, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์ฒ˜๋ฆฌ.

MySQL ์—”์ง„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋ ค๋ฉด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์–‘์„ ์ค„์ด๋Š”๊ฒŒ ๋งค์šฐ ์ค‘์š”!

2.1.3 DB ์˜ค๋ธŒ์ ํŠธ ์šฉ์–ด

MySQL์€ 2์ฐจ์› ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌํ•œ๋‹ค.

ํ…Œ์ด๋ธ”์€ ๋กœ์šฐ(ํ–‰)๊ณผ ์ปฌ๋Ÿผ(์—ด)์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๊ธฐ๋ณธํ‚ค Primary Key (์ฃผ ํ‚ค)

ํŠน์ • ํ–‰์„ ๋Œ€ํ‘œํ•˜๋Š” ์—ด์„ ๊ฐ€๋ฅดํ‚ค๋Š” ์šฉ์–ด

MySQL์—์„œ ๊ธฐ๋ณธ ํ‚ค๋Š” **ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค(Clustered Index)**๋กœ ์ž‘๋™ํ•œ๋‹ค.

์ด๋Š” ๊ธฐ๋ณธ ํ‚ค์˜ ๊ตฌ์„ฑ ์—ด ์ˆœ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌผ๋ฆฌ์ ์ธ ์Šคํ† ๋ฆฌ์ง€์— ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ธ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ฆ‰, ๋น„์Šทํ•œ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’๋“ค์ด ๊ทผ๊ฑฐ๋ฆฌ์— ์ ์žฌ๋˜๋ฏ€๋กœ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ธ๋ฑ์Šค์˜ ์ฃผ์˜์‚ฌํ•ญ ๊ธฐ๋ณธ ํ‚ค์™€ ๋˜‘๊ฐ™์€ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฌผ๋ฆฌ์  ๊ณต๊ฐ„์ด ๋‚ญ๋น„๋˜๋Š” ํ•œํŽธ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆ˜์ •์— ๋”ฐ๋ฅธ ์ธ๋ฑ์Šค ์ •๋ ฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์˜ˆ์‹œ CREATE TABLE ํ•™์ƒ ( ํ•™๋ฒˆ INT(11) NOT NULL, ์ด๋ฆ„ VARCHAR(14) NOT NULL, โ€ฆ PRIMARY KEY (ํ•™๋ฒˆ), INDEX I_ํ•™๋ฒˆ (ํ•™๋ฒˆ) ) ์ด๋Ÿฌํ•œ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ๊ณต๊ฐ„ ๋‚ญ๋น„ & ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ์œผ๋กœ ๋น„์šฉ์ฆ๊ฐ€ โ†’ ์‚ญ์ œํ•˜์ž.

์™ธ๋ž˜ ํ‚ค Foreign Key

์™ธ๋ž˜ ํ‚ค๋Š” ์™ธ๋ถ€์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ํ•ญ์ƒ ์ฐธ์กฐํ•˜๋ฉด์„œ, ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•จ๊ป˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ํ‚ค.

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

์ธ๋ฑ์Šค Index

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ‚ค ๊ฐ’์œผ๋กœ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์†๋„๋ฅผ ๋†’์ด๊ณ ์ž ์ƒ์„ฑ๋˜๋Š”, ํ‚ค ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

๊ณ ์œ  ์ธ๋ฑ์Šค Unique Index

์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ด๋“ค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ผํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ฐจ๋ก€๋กœ ์ •๋ ฌ๋˜๋Š” ์ธ๋ฑ์Šค ์—ด์˜ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๊ณ  ์œ ์ผ์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

ALTER TABLE ํ•™์ƒ
ADD UNIQUE INDEX ์—ฐ๋ฝ์ฒ˜_์ธ๋ฑ์Šค(์—ฐ๋ฝ์ฒ˜);

๊ธฐ๋ณธ ํ‚ค์™€ ๊ณ ์œ  ์ธ๋ฑ์Šค์˜ ์ฐจ์ด์  ๊ธฐ๋ณธ ํ‚ค์™€ ๊ณ ์œ  ์ธ๋ฑ์Šค ๋ชจ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ํŠน์„ฑ๊ณผ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์œ„ํ•œ ์ธ๋ฑ์Šค์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ ๋‹ค๋งŒ, ๊ธฐ๋ณธ ํ‚ค์—๋Š” NULL์„ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ณ ์œ  ์ธ๋ฑ์Šค์—๋Š” ์–ผ๋งˆ๋“ ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์กด์žฌ.

๋น„๊ณ ์œ  ์ธ๋ฑ์Šค Non-unique Index

๋น„๊ณ ์œ  ์ธ๋ฑ์Šค๋Š” ๊ณ ์œ  ์ธ๋ฑ์Šค์—์„œ ๋ฐ์ดํ„ฐ์˜ ์œ ์ผํ•œ ์†์„ฑ๋งŒ ์ œ์™ธํ•œ ํ‚ค์ด๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์žฌ์ •๋ ฌ๋˜๋”๋ผ๋„ ์ธ๋ฑ์Šค ์—ด์˜ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค.

ALTER TABLE ํ•™์ƒ
ADD INDEX ์ด๋ฆ„_์ธ๋ฑ์Šค (์ด๋ฆ„);

๋ทฐ View

๋ทฐ == ๊ฐ€์ƒ ํ…Œ์ด๋ธ”

์ œํ•œ๋œ ์ •๋ณด๋งŒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ์Šคํ…œ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์šด์˜ํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋งŒํผ ๋ณด์•ˆ์„ฑ ์ธก๋ฉด์—์„œ ๋ทฐ์˜ ๊ฐ€์น˜๊ฐ€ ๋ถ€๊ฐ๋  ์ˆ˜ ์žˆ๋‹ค.

๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ผ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ , ๋…ธ์ถœ์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ œ์•ฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ์„ฑ ๋•Œ๋ฌธ. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•ด์„œ ํ™œ์šฉํ•  ๋Œ€๋Š” ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•œ ์ตœ์ ํ™”๋œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ผ๊ด€๋œ ์„ฑ๋Šฅ ์ œ๊ณต

2.2.1 ์„œ๋ธŒ์ฟผ๋ฆฌ ์œ„์น˜์— ๋”ฐ๋ฅธ SQL ์šฉ์–ด

์„œ๋ธŒ์ฟผ๋ฆฌ(subquery)๋ž€ ์ฟผ๋ฆฌ ์•ˆ์˜ ๋ณด์กฐ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์šฉ์–ด์ด๋‹ค.

๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์˜ SELECT ๋ฌธ์ธ ๋ฉ”์ธ ์ฟผ๋ฆฌ(main query)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ˆ์ชฝ์— ์ž‘์„ฑ๋œ SELECT ์— ๋”ฐ๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค.

SELECT (SELECT ... FROM ...) -- SELECT ์ ˆ: ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ (scalar subquery)
	FROM (SELECT ... FROM ...) -- FROM ์ ˆ: ์ธ๋ผ์ธ ๋ทฐ(inline view)
WHERE COLUMN_NAME IN (SELECT ... FROM ...) -- WHERE ์ ˆ: ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ(nested subquery)

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ

SELECT ์ ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SELECT ์ ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ FROM , WHERE ์ ˆ ์•ˆ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ด๊ฐ’์€ 1ํ–‰ 1์—ด์˜ ๊ตฌ์กฐ๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด 2๊ฐœ ์ด์ƒ ๋‚˜์˜จ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

์ธ๋ผ์ธ ๋ทฐ

FROM ์ ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ  ํ•œ๋‹ค.

FROM ์ ˆ ๋‚ด๋ถ€์—์„œ ์ผ์‹œ์ ์œผ๋กœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

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

์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ

WHERE ์ ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

์ค‘์ฒฉ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ณดํ†ต ๋น„๊ต์—ฐ์‚ฐ์ž(=, <, >, โ‰ค, โ‰ฅ, <>, โ‰ )๋ฅผ ๋น„๋กฏํ•ด IN, EXISTS, NOT EXIST ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

2.2.2 ๋ฉ”์ธ์ฟผ๋ฆฌ์™€์˜ ๊ด€๊ณ„์„ฑ์— ๋”ฐ๋ฅธ SQL ์šฉ์–ด

๋น„์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ Non Correlated Subquery

๋น„์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์™€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฐ„์— ๊ด€๊ณ„์„ฑ์ด ์—†์Œ์„ ๋งํ•œ๋‹ค.

์ฆ‰, ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋…์ž์ ์œผ๋กœ ์‹คํ–‰๋œ ๋’ค ๋ฉ”์ธ์ฟผ๋ฆฌ์—๊ฒŒ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋˜์ ธ์ฃผ๋Š” ํ˜•ํƒœ์ธ ๊ฒƒ์ด๋‹ค.

SELECT ...
	FROM ํ•™์ƒ
WHERE ... IN (
	SELECT ... FROM ์ง€๋„๊ต์ˆ˜ -- ๋น„์ƒ๊ด€ ์ฟผ๋ฆฌ -> ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€ ์—ฐ๊ด€์„ฑ ์—†์Œ
)
-- ์‹คํ–‰์ˆœ์„œ: ์„œ๋ธŒ์ฟผ๋ฆฌ -> ๋ฉ”์ธ์ฟผ๋ฆฌ

์ƒ๊ด€ ์„œ๋ธŒ ์ฟผ๋ฆฌ Correlated Subquery

์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์™€ ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฐ„์— ๊ด€๊ณ„์„ฑ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ ค๋ฉด ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ๊ฐ’์„ ๋ฐ›์•„์•ผ ํ•จ์œผ๋กœ ์„œ๋กœ ๊ด€๊ณ„๊ฐ€ ๊นŠ๊ฒŒ ์œ ์ง€๋œ๋‹ค.

SELECT ...
	FROM ํ•™์ƒ
WHERE ... IN (
	SELECT ... FROM ์ง€๋„๊ต์ˆ˜ WHERE ํ•™์ƒ.ํ•™๋ฒˆ = ... -- ์ƒ๊ด€ ์ฟผ๋ฆฌ -> ๋ฉ”์ธ ์ฟผ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฐ›์Œ ํ•™์ƒ.ํ•™๋ฒˆ
)
-- ์‹คํ–‰ ์ˆœ์„œ: ๋ฉ”์ธ์ฟผ๋ฆฌ -> ์„œ๋ธŒ์ฟผ๋ฆฌ -> ๋ฉ”์ธ์ฟผ๋ฆฌ

๋‘๋‘ฅ ์˜ตํ‹ฐ๋งˆ์ด์ € ๋“ฑ์žฅ!

์šฐ๋ฆฌ๋Š” ์˜๋„ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด ์„œ๋ธŒ์ฟผ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ์‹คํ–‰๊ณ„ํš์ด ๊ฒฐ์ •๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— DB ๋ฒ„์ „ ํ˜น์€ ์˜ตํ‹ฐ๋งˆ์ด์ €์— ๋”ฐ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ•˜๋‚˜์˜ ๋ฉ”์ธ์ฟผ๋ฆฌ๋กœ ํ†ตํ•ฉ๋˜๋Š” ๋ทฐ ๋ณ‘ํ•ฉ(View Merging), ์ฆ‰ SQL ์žฌ์ž‘์„ฑ(rewrite)์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.2.3 ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ SQL ์šฉ์–ด

๋‹จ์ผํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ Single-Row Subquery

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ 1๊ฑด์˜ ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

์ฃผ๋กœ ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ Multiple-Row Subquery

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฑด์˜ ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

SELECT ...
	FROM ...
WHERE ํ•™๋ฒˆ IN (
	SELECT MAX(ํ•™๋ฒˆ) FROM ํ•™์ƒ GROUP BY ์ „๊ณต์ฝ”๋“œ	
) -- ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ

๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ Multiple-Column Subquery

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ด๊ณผ ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

SELECT ...
	FROM ...
WHERE (์ด๋ฆ„, ์ „๊ณต์ฝ”๋“œ) IN (
	SELECT ์ด๋ฆ„, ์ „๊ณต์ฝ”๋“œ FROM ํ•™์ƒ WHERE ์ด๋ฆ„ LIKE '๊น€%'
) -- ๋‹ค์ค‘์—ด ์„œ๋ธŒ์ฟผ๋ฆฌ

2.2.4 ์กฐ์ธ ์—ฐ์‚ฐ๋ฐฉ์‹ ์šฉ์–ด

๋‹ค์ˆ˜์˜ ํ…Œ์ด๋ธ”์— ํฉ์–ด์ ธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ ์กฐ์ธ(Join) ๋ฐฉ์‹ ์‚ฌ์šฉ

๋‚ด๋ถ€ ์กฐ์ธ Inner Join

์–‘์ชฝ์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ˜ํ™˜ (๊ต์ง‘ํ•ฉ)

-- ๋ช…์‹œ์  ์กฐ์ธ
SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ
	INNER JOIN ์ง€๋„๊ต์ˆ˜
		ON ํ•™์ƒ.ํ•™๋ฒˆ = ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ

-- ์•”์‹œ์  ์กฐ์ธ
SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ, ์ง€๋„๊ต์ˆ˜
WHERE ํ•™์ƒ.ํ•™๋ฒˆ = ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ

์™ผ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ Left Outer Join

์™ผ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์— ํฌํ•จ๋œ๋‹ค.

SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ
LEFT OUTER JOIN ๋˜๋Š” LEFT JOIN ์ง€๋„๊ต์ˆ˜
	ON ํ•™์ƒ.ํ•™๋ฒˆ = ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ

์˜ค๋ฅธ์ชฝ ์™ธ๋ถ€ ์กฐ์ธ Right Outer Join

์กฐ์ธ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ์— ํฌํ•จ๋œ๋‹ค.

SELECT ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ
RIGHT OUTER JOIN ๋˜๋Š” RIGHT JOIN ์ง€๋„๊ต์ˆ˜
	ON ํ•™์ƒ.ํ•™๋ฒˆ = ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ

LEFT JOIN vs RIGTH JOIN ์‚ฌ๋žŒ์˜ ์ธ์ง€์  ํŠน์„ฑ์ƒ ๋ณดํ†ต ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ์„ ์ •๋ฐฉํ–ฅ์œผ๋กœ ์ธ์‹. ๋”ฐ๋ผ์„œ, LEFT JOIN์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ. ์ผ๊ด€๋œ ์กฐ์ธ๋ฌธ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์œ ์ง€๋ณด์ˆ˜๋‚˜ ๊ด€๋ฆฌํŽธ์˜์„ฑ ์ธก๋ฉด์—์„œ ์ด์ ์„ ์–ป์ž

FULL OUTER JOIN์€? FULL OUTER JOIN์˜ ๊ฒฝ์šฐ LEFT JOIN ๊ณผ RIGTH JOIN์ด ํ†ตํ•ฉ๋œ ๋ฐฉ์‹์œผ๋กœ MySQL๊ณผ MariaDB์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

๊ต์ฐจ ์กฐ์ธ Cross Join

๊ต์ฐจ ์กฐ์ธ์€ ๋ฐ์นด๋ฅดํŠธ ๊ณฑ(cartesian product) ๊ณฑ์ง‘ํ•ฉ ๊ฐœ๋…, ์กฐ์ธ์— ์ฐธ์—ฌํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์กฐํ•ฉ์„ ์ฐพ์•„๋‚ด์–ด ๋ฐ˜ํ™˜.

-- ๋ช…์‹œ์  ์กฐ์ธ
SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ
	CROSS JOIN ์ง€๋„๊ต์ˆ˜

-- ์•”์‹œ์  ์กฐ์ธ
SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ์ง€๋„๊ต์ˆ˜.ํ•™๋ฒˆ, ์ง€๋„๊ต์ˆ˜.๊ต์ˆ˜๋ช…
FROM ํ•™์ƒ, ์ง€๋„๊ต์ˆ˜

-- ์•”์‹œ์  ์กฐ์ธ์˜ ๊ฒฝ์šฐ WHERE ์ ˆ์˜ ์กฐ์ธ ์กฐ๊ฑด๋ฌธ์ด๋‚˜ 
-- JOIN ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ์ž‘์„ฑํ•˜๋ฉด CROSS JOIN์ด ๋œ๋‹ค.

์ž์—ฐ ์กฐ์ธ Natural Join

2๊ฐœ ํ…Œ์ด๋ธ”์— ๋™์ผํ•œ Column ์ด๋ฆ„์ด ์žˆ์„ ๋•Œ ์กฐ๊ฑด์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์กฐ์ธ์ด ๋˜๋Š” ๋ฐฉ์‹.

SELECT ํ•™์ƒ.*, ์ง€๋„๊ต์ˆ˜.*
FROM ํ•™์ƒ
	NATURAL JOIN ์ง€๋„๊ต์ˆ˜

๋‹จ, ๋™์ผํ•œ Column ์ด๋ฆ„์ด ์กด์žฌํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ Cross Join๋ฐœ์ƒ.

๊ทธ๋Ÿผ ๋ฌด์Šจ ์กฐ์ธ ์‚ฌ์šฉํ• ๊นŒ?

๋ช…์‹œ์  INNER JOIN ํ˜น์€ LEFT OUTER JOIN ๋ฌด์กฐ๊ฑด์ด๋‹ค.

๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋„˜์‚ฌ.

2.2.5 ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์šฉ์–ด

๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”(Driving table)๊ณผ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”(Driven table)

๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” == ๋จผ์ € ์ ‘๊ทผํ•˜๋Š” ํ…Œ์ด๋ธ”

๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” == ๋’ค ๋Šฆ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ํ…Œ์ด๋ธ”

SELECT ํ•™์ƒ.ํ•™๋ฒˆ, ํ•™์ƒ.์ด๋ฆ„, ๋น„์ƒ์—ฐ๋ฝ๋ง.๊ด€๊ณ„, ๋น„์ƒ์—ฐ๋ฝ๋ง.์—ฐ๋ฝ์ฒ˜
FROM ํ•™์ƒ
	JOIN ๋น„์ƒ์—ฐ๋ฝ๋ง
		ON ํ•™์ƒ.ํ•™๋ฒˆ = ๋น„์ƒ์—ฐ๋ฝ๋ง. ํ•™๋ฒˆ
WHERE ํ•™์ƒ.ํ•™๋ฒˆ IN(1, 100)
-- ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” == ํ•™์ƒ
-- ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” == ๋น„์ƒ์—ฐ๋ฝ๋ง

๊ฐ€๋Šฅํ•˜๋ฉด ์ ์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ์ •.

์กฐ์ธ ์กฐ๊ฑด์ ˆ์˜ ์—ด์ด ์ธ๋ฑ์Šค๋กœ ์„ค์ •๋˜๋„๋ก ๊ตฌ์„ฑ.

์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ Nested Loop Join, NL Join

์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์€ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ 1๊ฑด๋‹น ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณตํ•ด ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. (๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” N * ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” M)

SELECT ...
FROM ํ•™์ƒ
	JOIN ๋น„์ƒ์—ฐ๋ฝ๋ง
		ON ํ•™์ƒ.ํ•™๋ฒˆ = ๋น„์ƒ์—ฐ๋ฝ๋ง.ํ•™๋ฒˆ
WHERE ํ•™์ƒ.ํ•™๋ฒˆ IN(1, 100)
--
-- ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” ๊ฒฐ๊ณผ๋Š” 1๊ณผ 100 2๊ฐœ
-- ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๋น„์ƒ์—ฐ๋ฝ๋ง์˜ ํ…Œ์ด๋ธ”์ด ๋งŒ์•ฝ 1000๊ฑด์ด๋ผ๊ณ  ํ•˜๋ฉด
-- ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ตœ์•… 2000๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋จ.
-- ๋งŒ์•ฝ, ์กฐ์ธ ์กฐ๊ฑด์ ˆ์ด ๋ชจ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค์žˆ๋‹ค๋ฉด == ํ•™์ƒ ํ…Œ์ด๋ธ” ํ•™๋ฒˆ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค, ๋น„์ƒ์—ฐ๋ฝ๋ง ํ•™๋ฒˆ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค
-- ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๋น„์ƒ์—ฐ๋ฝ๋ง ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ์ธ๋ฑ์Šค๋งŒ ์ ‘๊ทผ.
-- ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํšŸ์ˆ˜ ๊ฐ์†Œ.

์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์Šค๋กœ ์ •์˜๋œ ์—ด ๊ธฐ์ค€์œผ๋กœ ์ˆœ์ฐจ ์ •๋ ฌ๋˜์ง€๋งŒ, ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋น„๊ณ ์œ  ์ธ๋ฑ์Šค์ผ ๊ฒฝ์šฐ

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์ž„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๋žœ๋ค ์•ก์„ธ์Šค(Random Access)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ์˜ ์•ก์„ธ์Šค ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์กฐ๊ฑด์ ˆ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐ๋ณธ ํ‚ค๋Š” ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค์ด๋ฏ€๋กœ ๊ธฐ๋ณธ ํ‚ค์˜ ์ˆœ์„œ๋Œ€๋กœ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์žฌ๋˜์–ด ์žˆ์–ด ์กฐํšŒ ํšจ์œจ์ด ๋งค์šฐ ๋†’๋‹ค.

๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ Block Nested Loop Join, BNL Join

์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค์žˆ์ง€ ์•Š๋Š” ์ƒํ™ฉ์˜ ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ.

  1. **์กฐ์ธ ๋ฒ„ํผ(Join Buffer)**์— ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐฐ๋•Œ๊นŒ์ง€ ์ ์žฌ.
  2. ์กฐ์ธ ๋ฒ„ํผ์™€ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ธํ•˜๋Š” ์‹์œผ๋กœ ๋ฐ˜๋ณต.

ํ•ด๋‹น ๊ณผ์ •์€ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ํ’€ ์Šค์บ”์„ ์ค„์ด๋Š” ๊ฒŒ ๋ชฉ์ ์ด๋‹ค.

๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” Full Scan โ†’ ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ” Full Scan ๋ฐ˜๋ณต์„ ์ตœ์†Œํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์น˜ ํ‚ค ์—‘์„ธ์Šค ์กฐ์ธ Batched Key Access Join(BKA ์กฐ์ธ)

์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ ๋ฐฉ์‹์˜ ์ธ๋ฑ์Šค์˜ ๋žœ๋ค ์—‘์„ธ์Šค์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž,

์ ‘๊ทผํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ์ƒํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์ฐฉ์•ˆ๋œ ์กฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

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

์ด๋•Œ, ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋ฒ„ํผ์— ์ ์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ **๋‹ค์ค‘ ๋ฒ”์œ„ ์ฝ๊ธฐ(Multi Range Read, MRR)**๋ผ๊ณ  ํ•œ๋‹ค.

๋ฏธ๋ฆฌ ์˜ˆ์ธก, ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šค ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ์•„๋‹Œ ์‹œํ€€์…œ ์•ก์„ธ์Šค๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

ํ•ด์‹œ ์กฐ์ธ Hash Join

MySQL 8.0.18 ๋ฒ„์ „ ๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” ๋ฐฉ์‹.(์ƒ์šฉ DMBS ์˜ค๋ผํด ๊ฐ™์€ ์• ๋“ค์€ ์ด๋ฏธ ์ง€์›ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.)

๋ธ”๋ก ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ๊ณผ ๋ฐฐ์น˜ ํ‚ค ์•ก์„ธ์Šค ์กฐ์ธ์˜ ํ•œ๊ณ„๋ฅผ ํƒˆํ”ผํ•˜๊ธฐ ์œ„ํ•จ.

์กฐ์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฐ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋ถ€ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋‚ด๋ถ€ ์กฐ์ธ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋Š” ์กฐ์ธ ๋ฒ„ํผ์— ์ €์žฅ๋˜๋ฏ€๋กœ ์กฐ์ธ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

2.3.1 ๊ธฐ์ดˆ ์šฉ์–ด - ์˜ค๋ธŒ์ ํŠธ ์Šค์บ” ์œ ํ˜•

ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” Table Full Scan

ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์€ ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ”๋กœ ๋ฐ”๋กœ ์งํ–‰ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ํ›‘์–ด๋ณด๋Š” ๋ฐฉ์‹.

ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์€ ์ธ๋ฑ์Šค ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ์‹. ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ๋ถ€์ •์ .

์ธ๋ฑ์Šค ๋ฒ”์œ„ ์Šค์บ” Index Range Scan

์ธ๋ฑ์Šค ๋ฒ”์œ„ ์Šค์บ”์€ ์ธ๋ฑ์Šค๋ฅผ ๋ฒ”์œ„ ๊ธฐ์ค€์œผ๋กœ ์Šค์บ”ํ•œ ๋’ค ์Šค์บ” ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹.

์ข์€ ๋ฒ”์œ„๋ฅผ ์Šค์บ”ํ•  ๋•Œ ๋งค์šฐ ํšจ์œจ์ , ๋„“์€ ๋ฒ”์œ„์˜ ๊ฒฝ์šฐ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹

SQL์˜ BETWEEN ~ AND, <, >, LIKE ๊ตฌ๋ฌธ ๋“ฑ์— ์‚ฌ์šฉ๋จ.

์ธ๋ฑ์Šค ํ’€ ์Šค์บ” Index Full Scan

์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์€ ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹.

๋‹จ, ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋กœ ๊ตฌ์„ฑ๋œ ์—ด ์ •๋ณด๋งŒ ์š”๊ตฌํ•˜๋Š” SQL ๋ฌธ์—์„œ ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”์ด ์ˆ˜ํ–‰๋จ.

ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ ์ข‹์Œ.

๊ทธ๋Ÿฌ๋‚˜, ์ตœ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ SQL ํŠœ๋‹ ๊ถŒ์žฅ.

์ธ๋ฑ์Šค ๊ณ ์œ  ์Šค์บ” Index Unique Scan

์ธ๋ฑ์Šค ๊ณ ์œ  ์Šค์บ”์€ ๊ธฐ๋ณธ ํ‚ค๋‚˜ ๊ณ ์œ  ์ธ๋ฑ์Šค๋กœ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹.

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šค์บ” ๋ฐฉ์‹ ์ค‘ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์Šค์บ” ๋ฐฉ๋ฒ•.

WHERE ๊ธฐ๋ณธ ํ‚ค ํ˜น์€ ๊ณ ์œ  ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ = ์กฐ๊ฑด ์œผ๋กœ ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ํ™œ์šฉ๋จ.

์ธ๋ฑ์Šค ๋ฃจ์Šค ์Šค์บ” Index Loose Scan

์ธ๋ฑ์Šค ๋ฃจ์Šค ์Šค์บ”์€ ์ธ๋ฑ์Šค์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค๋งŒ ๊ณจ๋ผ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹.

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ ๋’ค ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค ํ‚ค๋Š” ๋ฌด์‹œ.

GROUP BY , MAX(), MIN() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ž‘๋™.

์ธ๋ฑ์Šค ๋ณ‘ํ•ฉ ์Šค์บ” Index Merge Scan

์ธ๋ฑ์Šค ๋ณ‘ํ•ฉ ์Šค์บ”์€ ํ…Œ์ด๋ธ” ๋‚ด์— ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๋“ค์„ ํ†ตํ•ฉํ•ด์„œ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹.

์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ ธ์™€ ๊ฒฐํ•ฉ(Union)๊ณผ ๊ต์ฐจ(Intersection) ๋ฐฉ์‹์„ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ๊ฐ ์‹คํ–‰ํ•˜๋ฉฐ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์Œ.

๊ฐœ๋ณ„ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ๊ฐ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•˜๋Š” ์‹œ๊ฐ„์ด ๋ช‡ ๋ฐฐ๋กœ ๊ฑธ๋ฆผ.

๋”ฐ๋ผ์„œ, ๋ณ„๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค๋กœ ํ†ตํ•ฉ ํ˜น์€ SQL๋ฌธ ์ž์ฒด๋ฅผ ๋…๋ฆฝ๋œ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ

2.3.1 ๊ธฐ์ดˆ ์šฉ์–ด - ๋””์Šคํฌ ์ ‘๊ทผ ๋ฐฉ์‹

์‹œํ€€์…œ ์•ก์„ธ์Šค Sequential Access

์ธ์ ‘ํ•œ ํŽ˜์ด์ง€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ๋Š” ์ˆœ์ฐจ ์ ‘๊ทผ ๋ฐฉ์‹, ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์—์„œ ํ™œ์šฉ๋จ.

๋žœ๋ค ์•ก์„ธ์Šค Random Access

๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ ํŽ˜์ด์ง€๋“ค์— ์ž„์˜ ์ ‘๊ทผ ๋ฐฉ์‹.

๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ ํ—ค๋”๊ฐ€ ์›€์ง์ด๋Š” ๋น„์šฉ์ด ๋ณด๋‹ค ํผ.

์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ณ  ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠœ๋‹ํ•ด์•ผ ํ•จ.

2.3.1 ๊ธฐ์ดˆ ์šฉ์–ด - ์กฐ๊ฑด ์œ ํ˜•

์—‘์„ธ์Šค ์กฐ๊ฑด Access Condition

๋””์Šคํฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” SQL ํŠœ๋‹์˜ ํ•ต์‹ฌ.

์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” WHERE ์ ˆ์˜ ํŠน์ • ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•ด ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ด๋Š” ์กฐ๊ฑด์ ˆ์„ ์„ ํƒํ•˜์—ฌ, ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์ ‘๊ทผํ•˜๊ณ  MySQL ์—”์ง„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

SELECT *
FROM TAB
WHERE ID = 1
	AND CODE ='A';
-- ID ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค O, CODE ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค X

์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ID ์ปฌ๋Ÿผ์„ ํ†ตํ•ด ๋””์Šคํฌ์— ์ ‘๊ทผํ•œ๋‹ค.

์ด๊ฒŒ ์—‘์„ธ์Šค ์กฐ๊ฑด์ด๋‹ค.

ํ•„ํ„ฐ ์กฐ๊ฑด Filter Condition

์—‘์„ธ์Šค ์กฐ๊ฑด์„ ์ด์šฉํ•ด MySQL ์—”์ง„์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ถ”๊ฐ€๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•˜๋Š” ์กฐ๊ฑด.

ํ•„ํ„ฐ ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋ง๋˜์–ด ์ œ๊ฑฐ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌ ํ• ์ˆ˜๋ก ํšจ์œจ์ด ์ข‹์ง€ ์•Š๋‹ค.

์Šคํ† ๋ฆฌ์ง€์—์„œ MySQL ์—”์ง„์œผ๋กœ ๋„˜๊ธฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ.

์ œ๊ฑฐ๋  ๋ฐ์ดํ„ฐ๋ผ๋ฉด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ™์ด ์ œ์™ธ๋˜๋Š” ํŽธ์ด ํšจ์œจ์ 

SELECT *
FROM TAB
WHERE ID = 1
	AND CODE ='A';  -- CODE = 'A' ์ด๊ฒŒ ํ•„ํ„ฐ ์กฐ๊ฑด์ž„.

2.3.2 ์‘์šฉ ์šฉ์–ด

์„ ํƒ๋„ Selectivity

ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น ์—ด์˜ ์กฐ๊ฑด์ ˆ์— ๋”ฐ๋ผ ์„ ํƒ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋น„์œจ

๋‚ฎ์€ ์„ ํƒ๋„๋ฅผ ๊ฐ€์ง€๋Š” ์—ด์€ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•  ๋•Œ ์ฃผ์š” ๊ณ ๋ ค ๋Œ€์ƒ

์„ ํƒ๋„ = ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ / ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜

๋ณ€ํ˜•๋œ ์„ ํƒ๋„ = 1 / DISTINCT(COUNT COLUMN_NAME) -- ๋ณดํ†ต ์ค‘๋ณต์ด ์ œ๊ฑฐ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฑด์ˆ˜๋ฅผ ํ™œ์šฉํ•จ.
-- ์˜ˆ์‹œ ํ•™๋ฒˆ
-- ์ด 100๋ช…์˜ ํ•™์ƒ ์ค‘ ํ•™๋ฒˆ์„ ํ†ตํ•ด ํ•™์ƒ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ
ํ•™๋ฒˆ ์—ด์˜ ์„ ํƒ๋„ = 1 / 100 = 0.01 -- ๋‚ฎ์€ ์„ ํƒ๋„

-- ์˜ˆ์‹œ ์„ฑ๋ณ„
-- ์ด 100๋ช…์˜ ํ•™์ƒ ์ค‘ ์„ฑ๋ณ„์„ ํ†ตํ•ด ํ•™์ƒ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ
์„ฑ๋ณ„ ์—ด์˜ ์„ ํƒ๋„ =  50 / 100 = 0.5 -- ๋†’์€ ์„ ํƒ๋„

์นด๋””๋„๋ฆฌํ‹ฐ Cardinality

์‚ฌ์ „์  ์ •์˜๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ์ •์˜๋˜๋Š” ๋ฐ์ดํ„ฐ ํ–‰์˜ ๊ฐœ์ˆ˜.

ํ˜„์—…์—์„œ๋Š” ์ „์ฒด ํ–‰์— ๋Œ€ํ•œ ํŠน์ • ์—ด์˜ ์ค‘๋ณต ์ˆ˜์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ๋กœ ์‚ฌ์šฉ.

์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์ ๋‹ค๋ฉด ์นด๋””๋„๋ฆฌํ‹ฐ ๋†’์Œ

์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ๋งŽ์œผ๋ฉด ์นด๋””๋„๋ฆฌํ‹ฐ ๋‚ฎ์Œ

์นด๋””๋„๋ฆฌํ‹ฐ = ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜ * ์„ ํƒ๋„
-- ์˜ˆ์‹œ 
-- ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ: ์นด๋””๋„๋ฆฌํ‹ฐ ๋†’์Œ
-- ์ด๋ฆ„: ์นด๋””๋„๋ฆฌํ‹ฐ ์ค‘๊ฐ„
-- ์„ฑ๋ณ„: ์นด๋””๋„ˆ๋ฆฌํ‹ฐ ๋‚ฎ์Œ

ํžŒํŠธ Hint

์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ

-- ์ฃผ์„์ฒ˜๋Ÿผ ํžŒํŠธ ๋ช…์‹œํ•˜๋Š” ๋ฒ•
SELECT ํ•™๋ฒˆ, ์ „๊ณต์ฝ”๋“œ
FROM ํ•™์ƒ /*! USE INDEX (ํ•™์ƒ_IDX01) */
WHERE ์ด๋ฆ„ = '์œ ์žฌ์„';

-- ์ฟผ๋ฆฌ์˜ ์ผ๋ถ€๋กœ ์ž‘์„ฑ
SELECT ํ•™๋ฒˆ, ์ „๊ณต์ฝ”๋“œ
FROM ํ•™์ƒ USE INDEX (ํ•™์ƒ_IDX01)
WHERE ์ด๋ฆ„ = '์œ ์žฌ์„';

๋‹จ, ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์šฐ๋ฆฌ์˜ ํžŒํŠธ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฐธ๊ณ ํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค. ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์–„์งค ์—†๋‹ค. (๊ณผ์—ฐ ๋‚ด๊ฐ€ ์˜ตํ‹ฐ๋งˆ์ด์ €๋ณด๋‹ค ๋›ฐ์–ด๋‚ ๊นŒ?)

ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์–ด๋Š ํŠน์ • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ํžŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋‹ค๊ฐ€ ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋œ๋‹ค.

์ฝœ๋ ˆ์ด์…˜ Collation

ํŠน์ • ๋ฌธ์ž์…‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌํ•˜๋Š” ๊ทœ์น™.

-- ์˜ˆ์‹œ
utf8_bin: A > B > a > b
utf8_general_ci: A > a > B > b

๊ทธ๋Ÿผ ์บ๋ฆญํ„ฐ ์…‹(Character Set)์ด๋ž‘ ๋ญ๊ฐ€ ๋‹ค๋ฆ„? ์บ๋ฆญํ„ฐ ์…‹ == ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅ ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ทœ์น™ ์ฝœ๋ ˆ์ด์…˜ == ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ทœ์น™

728x90
๋ฐ˜์‘ํ˜•
MyeongDev