๐ŸฌMYSQL์—์„œ ์ธ๋ฑ์‹ฑ(indexing)ํ•˜๋Š” ๋ฐฉ๋ฒ•

yyยท2023๋…„ 11์›” 23์ผ
0

์žก๋™์‚ฐ์ด

๋ชฉ๋ก ๋ณด๊ธฐ
6/21

DB์—์„œ ๋ฐ์ดํ„ฐ(ํŠœํ”Œ)์„ ์กฐํšŒํ•  ๋•Œ full scan์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ DB๋ฅผ ๋‹ค ํ›‘์–ด์•ผํ•ด์„œ (๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„๊ฒฝ์šฐ) ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿด๋•Œ ์‚ฌ์šฉ๋˜๋Š”๊ฒŒ ์ธ๋ฑ์‹ฑ์ด๋‹ค.
mysql์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.



๐Ÿฌ ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๊ธฐ๋ฒ•

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ๊ธฐ๋ฒ•์ด๋ž€?

์ธ๋ฑ์‹ฑ์„ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‚ด๊ฐ€ ์ธ๋ฑ์‹ฑ์„ ์›ํ•˜๋Š” ์†์„ฑ(attribute)๊ณผ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค.
(์†์„ฑ(attribute)์€ ๋‚ด๋ฆผ์ฐจ์ •๋ ฌ์ด ๋œ ์ƒํƒœ๋กœ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋จ)
(ํฌ์ธํ„ฐ๋ž€ ์›๋ž˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ…Œ์ด๋ธ”์˜ ์ฃผ์†Œ)
1) ๊ทธ๋ ‡๊ฒŒ ์ •๋ ฌ๋œ ์†์„ฑ์—์„œ ์ ˆ๋ฐ˜์œ„์น˜์— ์žˆ๋Š” ๊ฐ’๊ณผ ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•œ๋‹ค.
2) ์ ˆ๋ฐ˜์œ„์น˜์— ์žˆ๋Š” ๊ฐ’์ด ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์•„๋ž˜๋Š” ๋”์ด์ƒ ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’์ด ์—†์œผ๋‹ˆ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๊ณ , ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’ ์ค‘์—์„œ ์ฐพ๋Š”๋‹ค.
3) ์ด๋ฒˆ์—๋„ ํฐ ๊ฐ’๋“ค ์ค‘ ์ ˆ๋ฐ˜ ์œ„์น˜์— ์žˆ๋Š” ๊ฐ’ ์„ ์ฐพ์•„ ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ฐพ๋Š”๋‹ค.
4) ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚ด๊ฐ€ ์ฐพ๋Š” ๊ฐ’์„ ์ฐพ๊ฒŒ๋˜๋ฉด ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์›๋ž˜ ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์„œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด์ง„ํƒ์ƒ‰๊ธฐ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒ ์œผ๋‚˜, ๊ทธ๋Ÿผ mysql์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ index๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?



๐Ÿฌ ์ธ๋ฑ์Šค ์ƒ์„ฑ

1) ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ

์ค‘๋ณตํ—ˆ์šฉ

CREATE INDEX ์ธ๋ฑ์Šค ์ด๋ฆ„ ON ํ…Œ์ด๋ธ”(์–ด๋–ค attribute); 

-- ์˜ˆ์‹œ (showsํ…Œ์ด๋ธ”์— ์žˆ๋Š” price๋ผ๋Š” attribute๋กœ showPrice๋ผ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ์•ผ) 
CREATE INDEX showPrice ON Shows(price);

์ค‘๋ณต ๋น„ํ—ˆ์šฉ
CREATE UNIQUE INDEX ์ธ๋ฑ์Šค ์ด๋ฆ„ ON ํ…Œ์ด๋ธ”(์–ด๋–ค attribute);



### 2) ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กœ ๋งŒ๋“ค๋•Œ ์ธ๋ฑ์Šค ๊ฑธ์–ด์ฃผ๊ธฐ

>```sql
CREATE TABLE shows (
id	 		 INT 		    PRIMARY KEY,
showName 	 VARCHAR(20)    NOT NULL,
price 		 INT,
location	 VARCHAR(20),
INDEX showPrice (price),
);```

<br><br>



## ๐Ÿฌ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ •์ด ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ

>```sql
SHOW INDEX FROM shows;



๐Ÿฌ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋ฌธ์— ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค ํ™•์ธ

-- ์•ž์— EXPLAIN๋งŒ ๋ถ™์ด๋ฉด ๋œ๋‹ค.
EXPLAIN SELECT * FROM shows WHERE price = 90000;



๐Ÿฌ ๋‚ด๊ฐ€ ์ง์ ‘ ์ธ๋ฑ์Šค ์„ค์ •ํ•˜๊ธฐ

์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•ด์ฃผ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด sql์— ์žˆ๋Š” optimizer๊ฐ€ ์•Œ์•„์„œ ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค. ์•Œ์•„์„œํ•˜๋‹ค๊ฐ€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿด๋• ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น๋ฌธ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

--๊ถŒ์žฅ๋Š๋‚Œ์œผ๋กœ ์ธ๋ฑ์Šค ์„ค์ •
SELECT * FROM shows USE INDEX(์ธ๋ฑ์Šค ์ด๋ฆ„)WHERE price= 90000; 

--์ด๊ฑธ ์‚ฌ์šฉํ•ด!์˜ ๋Š๋‚Œ์˜ ์„ค์ •
SELECT * FROM shows FORCE INDEX(์ธ๋ฑ์Šค ์ด๋ฆ„)WHERE price = 90000; 

์ด๋ ‡๊ฒŒ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์‹œํ•ด์คฌ์Œ์—๋„ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•œ๋‹ค๊ณ  optimizer๊ฐ€ ํŒ๋‹จํ•˜๋ฉด full scan์„ ํ•˜๊ฒŒ๋œ๋‹ค.

๐Ÿฌ ์ธ๋ฑ์Šค ์‚ญ์ œ

์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์„๋• ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ALTER TABLE ํ…Œ์ด๋ธ” ์ด๋ฆ„ DROP INDEX ์ธํ…์Šค ์ด๋ฆ„;

--์˜ˆ์‹œ
ALTER TABLE show DROP INDEX showPrice;



[์ฐธ๊ณ  ์ž๋ฃŒ - ์˜์ƒ] https://www.youtube.com/watch?v=IMDH4iAQ6zM

profile
์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๋ฟ ๋‚ด๊ฐ€ ๋ชปํ•  ๊ฑด ์—†๋‹ค.

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