๋ณตํ•ฉ ์ธ๋ฑ์Šค ํ™œ์šฉ ๊ฒฝ์šฐ์˜ ์ˆ˜

2023. 12. 31. 19:15ใ†Database/DB ์Šคํ„ฐ๋””

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ ํ˜•ํƒœ์— ์ผ์ผ์ด ๋Œ€์‘ํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŽ์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์ธ๋ฑ์Šค ์ƒ์„ฑ์— ์žˆ์–ด ๊ณ ๋ฏผ์˜ ์—ฌ์ง€๊ฐ€ ์ ๊ฒ ์ง€๋งŒ, ์•„์‰ฝ๊ฒŒ๋„ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ทธ์— ๋”ฐ๋ฅธ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(DML ์„ฑ๋Šฅ ์ €ํ•˜, ์ €์žฅ ๊ณต๊ฐ„ ์ฐจ์ง€)๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์€ ์ˆ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋™์‹œ์— ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ˜•ํƒœ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค ์Šค์บ”์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ…Œ์ด๋ธ” ์„ค๊ณ„๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. 

ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ์ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋ณตํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ , ๋ณตํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ด ๊ธ€์€ Mysql ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.

๋ณตํ•ฉ ์ธ๋ฑ์Šค ์ž‘๋™ ๋ฐฉ์‹

๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ๋‘˜ ์ด์ƒ์˜ ์นผ๋Ÿผ์„ ํ†ตํ•ด ์ƒ์„ฑํ•œ ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

# Mysql ๊ธฐ์ค€
CREATE INDEX {์ธ๋ฑ์Šค ๋ช…} ON {ํ…Œ์ด๋ธ” ๋ช…} (col1, ...);

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ์–ด๋–ค ์‹์œผ๋กœ ์ž‘๋™ํ• ๊นŒ?

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

์ธ๋ฑ์Šค ์•ก์„ธ์Šค ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ B Tree ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ง์  ํƒ์ƒ‰์„ ํ•˜๋Š”๋ฐ ํ™œ์šฉ์ด ๋œ๋‹ค. ๋ฐ˜๋ฉด ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์€ ์ˆ˜์ง์  ํƒ์ƒ‰์ด ์™„๋ฃŒ๋œ ํ›„ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•  ๋•Œ ํ™œ์šฉ๋œ๋‹ค. 

์‹ค์งˆ์ ์ธ B ํŠธ๋ฆฌ ํƒ์ƒ‰ ๋ฒ”์œ„๋Š” ์ˆ˜์ง์  ํƒ์ƒ‰์„ ํ†ตํ•ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นผ๋Ÿผ์ด ์ธ๋ฑ์Šค ์•ก์„ธ์Šค ์กฐ๊ฑด์œผ๋กœ ํ™œ์šฉ๋˜๋„๋ก ์œ ๋„ํ•ด์•ผ ๋ถˆํ•„์š”ํ•œ ํ…Œ์ด๋ธ” ๋žœ๋ค ์•ก์„ธ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ์ธ๋ฑ์Šค ์Šค์บ” ํ™œ์šฉ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

 

๋ณตํ•ฉ์ธ๋ฑ์Šค ์ž‘๋™ ๊ฒฝ์šฐ์˜ ์ˆ˜

์ด์ œ ์œ„์—์„œ ์„œ์ˆ ํ•œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ์ดํ•ด๋ฅผ ํ† ๋Œ€๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋“ค์„ ์ง์ ‘ ํ™•์ธํ•ด๋ณด๊ฒ ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Mysql ์„œ๋ฒ„์— ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ์ด์— ๋ชฉ ๋ฐ์ดํ„ฐ๋ฅผ 50000๊ฐœ ์ฑ„์›Œ๋„ฃ์—ˆ๋‹ค.

CREATE TABLE test_table (
  id INT NOT NULL AUTO_INCREMENT,
  a INT NOT NULL,
  b INT NOT NULL,
  c INT NOT NULL,
  d INT NOT NULL,
  e INT NOT NULL,
  PRIMARY KEY (id)
);

๋˜ํ•œ ํ…Œ์ŠคํŠธ ์šฉ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ–ˆ๋‹ค.

CREATE INDEX test_idx ON test_table (a, b, c, d);

ํ™•์ธํ•ด๋ณผ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์กฐ๊ฑด์‹์— ๋ชจ๋“  ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ
  2. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ๋ถ€ํ„ฐ ์—ฐ์†์ )
  3. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ ํฌํ•จ X)
  4. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ์€ ํฌํ•จ๋˜๋‚˜ ์ค‘๊ฐ„์— ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” ๊ฒฝ์šฐ)
  5. ์กฐ๊ฑด์‹์— ๋ชจ๋“  ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์ด ํฌํ•จ๋˜๋‚˜, ์ค‘๊ฐ„์— ๋ฒ”์œ„ ํƒ์ƒ‰ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
  6. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (์กฐ๊ฑด์‹ -> ORDER BY ์ ˆ ์ˆœ์„œ)
  7. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (ORDER BY ์ ˆ -> ์กฐ๊ฑด์‹ ์ˆœ์„œ)
  8. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (์กฐ๊ฑด์‹ ์ผ๋ถ€ -> ORDER BY ์ ˆ -> ์กฐ๊ฑด์‹ ์ˆœ์„œ)

1. ์กฐ๊ฑด์‹์— ๋ชจ๋“  ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

์ด ๊ฒฝ์šฐ๋Š” ์‚ฌ์‹ค ์ธ๋ฑ์Šค๋ฅผ ํƒ„๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ช…ํ™•ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋Š”์ง€ ์•ˆํƒ€๋Š”์ง€์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ธฐ ๋ณด๋‹ค๋Š” ๊ฐ ์นผ๋Ÿผ์˜ ์นด๋””๋„๋ฆฌํ‹ฐ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์šฐ์„  ํ˜„์žฌ ๊ฐ ์นผ๋Ÿผ์— ๋Œ€ํ•œ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT
  (SELECT AVG(tmp_a.cnt) FROM (SELECT a, count(*) as cnt FROM test_table GROUP BY a) tmp_a) as avg_card_a,
  (SELECT AVG(tmp_b.cnt) FROM (SELECT b, count(*) as cnt FROM test_table GROUP BY b) tmp_b) as avg_card_b,
  (SELECT AVG(tmp_c.cnt) FROM (SELECT c, count(*) as cnt FROM test_table GROUP BY c) tmp_c) as avg_card_c,
  (SELECT AVG(tmp_d.cnt) FROM (SELECT d, count(*) as cnt FROM test_table GROUP BY d) tmp_d) as avg_card_d,
  (SELECT AVG(tmp_e.cnt) FROM (SELECT e, count(*) as cnt FROM test_table GROUP BY e) tmp_e) as avg_card_e;

์นด๋””๋„๋ฆฌํ‹ฐ ์กฐํšŒ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ a -> e๋กœ ๊ฐˆ์ˆ˜๋ก ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ด์ œ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘” ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SELECT * 
FROM test_table
WHERE a = 20 AND b = 150 AND c = 400 AND d = 750 AND e = 1500;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์ด์ œ ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘” ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ ์ค‘ ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆœ์œผ๋กœ (d, c, b, a) ๋กœ ๊ตฌ์„ฑํ•œ ๋’ค ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

(d, c, b, a) ์ธ๋ฑ์Šค ํ™œ์šฉ

๋‘ ์‹คํ–‰ ๊ณ„ํš์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์„œ๋กœ ์ฝ”์ŠคํŠธ๊ฐ€ ๋™์ผํ•˜๋‹ค. ์ฆ‰, ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๋‚ด์—์„œ ์นด๋””๋„๋ฆฌํ‹ฐ์— ๋”ฐ๋ผ ์ˆœ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. (๋‹ค๋งŒ, ์นด๋””๋„๋ฆฌํ‹ฐ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค์— ํฌํ•จํ• ์ง€ ๋ง์ง€ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ ํƒ€๋‹นํ•œ ๊ณ ๋ ค์ด๋‹ค.)

2. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ๋ถ€ํ„ฐ ์—ฐ์†์ )

์•„๋ž˜ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT *
FROM test_table
WHERE a = 20 AND b = 150 AND e = 1200;

(a, b, c, d) ์ธ๋ฑ์Šค ์‚ฌ์šฉ

์„ ๋‘์นผ๋Ÿผ๊ณผ ์ด์–ด์ง€๋Š” ์นผ๋Ÿผ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์กฐ๊ฑด์€ ์ธ๋ฑ์Šค ์Šค์บ”์— ํ™œ์šฉ๋œ๋‹ค.

3. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ ํฌํ•จ X)

์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT *
FROM test_table
WHERE b = 150 AND c = 400 AND d = 750;

(a, b, c, d) ์ธ๋ฑ์Šค ์‚ฌ์šฉ

๊ฒฐ๊ณผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ ์ธ๋ฑ์Šค๋ฅผ ์ „ํ˜€ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ํ…Œ์ด๋ธ” ํ’€์Šค์บ”์ด ์ˆ˜ํ–‰๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์„ ๋‘ ์นผ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์ธ๋ฑ์Šค ๋Œ€๋ถ€๋ถ„์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋˜๊ณ  ์ด๋ฅผ ํ† ๋Œ€๋กœ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผ๊นŒ์ง€ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ(SELECT * ๋•Œ๋ฌธ)์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ…Œ์ด๋ธ” ํ’€์Šค์บ”์„ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋งŒ์•ฝ, ์ฟผ๋ฆฌ๊ฐ€ SELECT * ์ด ์•„๋‹Œ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ a, b, c, d๋งŒ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ์˜€๋‹ค๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์–ด๋–ค ์„ ํƒ์„ ํ• ๊นŒ? ๊ทธ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

SELECT a, b, c, d
FROM test_table
WHERE b = 150 AND c = 400 AND d = 750;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์ธ๋ฑ์Šค ์Šค์บ”๋งŒ ์ˆ˜ํ–‰ํ•ด๋„ ์ฟผ๋ฆฌ์—์„œ ์›ํ•˜๋Š” ์นผ๋Ÿผ์„ ๋ชจ๋‘ ํš๋“ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์—” ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ๋ ˆ๋ฒจ์—์„œ ๋ถˆํ•„์š”ํ•œ ์นผ๋Ÿผ์€ ์กฐํšŒํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค๋ฉด ์ •์ƒ์ ์ธ ์ธ๋ฑ์Šค ํ™œ์šฉ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋”๋ผ๋„ (์„ ๋‘ ์นผ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š์Œ) ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•ด๋ณผ ์—ฌ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

4. ์กฐ๊ฑด์‹์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ์ผ๋ถ€๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์„ ๋‘ ์นผ๋Ÿผ์€ ํฌํ•จ๋˜๋‚˜ ์ค‘๊ฐ„์— ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” ๊ฒฝ์šฐ)

์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT * 
FROM test_table
WHERE a = 20 AND c = 400 AND d = 750 AND e = 1500;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด Index Scan์ด ์ˆ˜ํ–‰๋˜๋‚˜ ๋ณตํ•ฉ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์นผ๋Ÿผ ์ค‘ a ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋งŒ ์Šค์บ”์ด ์ˆ˜ํ–‰๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ทธ ๋’ค์— with index condition์ด๋ผ๋Š” ๊ตฌ๋ฌธ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” Mysql์˜ Index Condition Pushdown(ICP)์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, ICP๊ฐ€ ๋„์ž…๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์นผ๋Ÿผ a๋ฅผ ์ด์šฉํ•œ ์ธ๋ฑ์Šค ์Šค์บ”๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ด ๊ฒฐ๊ณผ๋ฅผ ํ† ๋Œ€๋กœ ๋‚˜๋จธ์ง€ ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋Š” ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ ํ•„ํ„ฐ๋ง์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ์ด๋ฏธ ์ธ๋ฑ์Šค ์Šค์บ”์„ ํ•˜๋ฉด์„œ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ c, d ์นผ๋Ÿผ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ธ๋ฐ, ICP๊ฐ€ ๋„์ž…๋œ ํ›„์—๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•  ๋•Œ ์ด ์ž‘์—…๋„ ๊ฐ™์ดํ•˜๊ฒŒ ๋œ๋‹ค. ์ผ์ข…์˜ ์ธ๋ฑ์Šค ์ˆ˜์ง์  ํƒ์ƒ‰์ธ ๊ฒƒ์ด๋‹ค. 

์ฆ‰, ์ด๋ฅผ ํ•ด์„ํ•˜๋ฉด a ์นผ๋Ÿผ์€ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค ์กฐ๊ฑด์œผ๋กœ c, d ์นผ๋Ÿผ์€ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ, ๋‚˜๋จธ์ง€ e ์นผ๋Ÿผ์€ ํ…Œ์ด๋ธ” ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฒƒ์ด๋‹ค. (์‚ฌ์‹ค ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ ๋ชปํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ ์˜์™ธ์— ๊ฒฐ๊ณผ. ๋‹ค๋ฅธ DB๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€๋Š” ํ™•์ธ์ด ํ•„์š”ํ•ด๋ณด์ธ๋‹ค.)

5. ์กฐ๊ฑด์‹์— ๋ชจ๋“  ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์ด ํฌํ•จ๋˜๋‚˜, ์ค‘๊ฐ„์— ๋ฒ”์œ„ ํƒ์ƒ‰ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT * 
FROM test_table 
WHERE a = 20 AND b > 100 AND c = 400 AND d = 750 AND e = 1500;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด a์™€ b๊นŒ์ง€๋Š” ์ธ๋ฑ์Šค ์Šค์บ”์— ํ™œ์šฉ๋˜์—ˆ๋‹ค. (์ธ๋ฑ์Šค ์ˆ˜์ง์  ํƒ์ƒ‰, ์ธ๋ฑ์Šค ์•ก์„ธ์Šค ์กฐ๊ฑด)

ํ•˜์ง€๋งŒ b ์นผ๋Ÿผ ์กฐ๊ฑด์ ˆ์„ ๋ฒ”์œ„ ํƒ์ƒ‰ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ์ดํ›„ ์นผ๋Ÿผ๋“ค์€ ๋ชจ๋‘ with index condition ์ ˆ์— ๋‚˜ํƒ€๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ ํ™œ์šฉ๋œ ๊ฒƒ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด)

6. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (์กฐ๊ฑด์‹ -> ORDER BY ์ ˆ ์ˆœ์„œ)

์ด ๊ฒฝ์šฐ๋Š” ์‚ฌ์‹ค ์ธ๋ฑ์Šค๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๋ฉฐ, ์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ๋„ ์Šคํ‚ต๋˜๋Š” ํ˜•ํƒœ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™•์ธ ์ฐจ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT * 
FROM test_table
WHERE a = 20 AND b = 200 AND e = 1500
ORDER BY c, d;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด c, d ์นผ๋Ÿผ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ๋”ฐ๋กœ ์—†์ง€๋งŒ Sort ์‹คํ–‰ ๊ณ„ํš์ด ์ƒ๋žต๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜๋„๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

7. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (ORDER BY ์ ˆ -> ์กฐ๊ฑด์‹ ์ˆœ์„œ)

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—” ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ์ด ์„ ๋‘ ์นผ๋Ÿผ์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ?

์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT * 
FROM test_table 
WHERE b = 100 AND c = 400 AND d = 750 AND e = 1500
ORDER BY a;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ „ํ˜€ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ฑด์ ˆ๋ณด๋‹ค ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ์ด ๋จผ์ € ํ™œ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—” ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

8. ์กฐ๊ฑด์‹ + ORDER BY ์ ˆ์˜ ์นผ๋Ÿผ๋“ค์ด ๋ชจ๋‘ ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ (์กฐ๊ฑด์‹ ์ผ๋ถ€ -> ORDER BY ์ ˆ -> ์กฐ๊ฑด์‹ ์ˆœ์„œ)

์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ–ˆ๋‹ค.

SELECT * 
FROM test_table
WHERE a = 20 AND d = 750 AND e = 1500
ORDER BY b, c;

(a, b, c, d) ์ธ๋ฑ์Šค ํ™œ์šฉ

ํ•ด๋‹น ๊ฒฝ์šฐ์—” ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. a ์นผ๋Ÿผ์„ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , d ์นผ๋Ÿผ์€ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ธ๋ฑ์Šค ๋ฆฌํ”„๋…ธ๋“œ๋Š” ์ด๋ฏธ b, c ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค ์„ ๋‘์นผ๋Ÿผ์„ ํ†ตํ•ด ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด Sorting์€ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํŒŒ์•…๋œ๋‹ค.