์ง๋ ๊ฐ์ ํ
์บ์๋ฅผ ์ฌ์ฉํด ์ ์ง๋ณด์์ฑ, ์ง๊ด์ฑ์ ํฌ์ํ์ง ์๊ณ DB ์ ๊ทผ์ ํฐ ํญ์ผ๋ก ์ค์๋ค! ๐
ํ์ง๋ง ๋ณด๋ค์ํผ ๋ญํน์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ ์์ง full-scan์ผ๋ก ๋ฐ์ํ๋ค.
๊ฒ์์ด ๋ง์์ง์๋ก ํจ์จ์ด ๋๋ ๊ฐ์ํ ๊ฒ์ด๋ค.
full-scan์ ๊ฐ์ ํด๋ณด์
AS-IS
SELECT rank() over (ORDER BY score DESC) as ranking, session_id
FROM apple_game
WHERE is_ended
limit 50;type=ALL, ์ฆ full-scan์ด๋ค.
TO-BE
์ธ๋ฑ์ฑ์ ๊ฑธ์ด๋ณด์
is_ended ์ปฌ๋ผ์ผ๋ก ๋๋์ง ์์ ๊ฒ์์ ์ ์ธ์ํฌ ์ ์๋ค.
create index apple_game_is_ended_index on apple_game (is_ended);index range scan์ผ๋ก ์ฝ์คํธ๊ฐ ์กฐ๊ธ ์ค์๋ค.
ํ์ด์ ์๊ธฐํ๋ฉด โ๋๋ ๊ฒ์โ์์๋ง ๊ฒ์ํ๋ฏ๋ก ๊ฒ์๋์ด ์ค์๋ค๋ ๊ฒ์ด๋ค!
score๋ก ์ ๋ ฌ์ด ์ผ์ด๋๋ฏ๋ก, score๋ก ์ธ๋ฑ์ฑํ๋ค.
create index apple_game_score_index on apple_game (score desc);์ด๊ฑด ์๋ชป ํ๋จํ๋ค.
is_ended๋ก ๋จผ์ ํํฐ๋ง ํ ํ score๋ก ์ ๋ ฌ์ด ์ผ์ด๋๋ฏ๋ก, score์๋ง ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค!
is_ended ๋ก ํํฐ๋ง๋ ํ๋ค์ score๋ก ์ ๋ ฌํ๋ฏ๋ก, score ๋ฐ is_score๋ฅผ ๋ณตํฉ ์ธ๋ฑ์ค๋ก ์ค์ ํ๋ค.
create index apple_game_is_ended_score_index on apple_game (is_ended, score desc);๋๋๊ฒ๋ cost๊ฐ ์ฒ์์ ๋นํด ์ฝ 55%๋ ์ค์๋ค.
์ค์ ์๊ฐ์ ์ฐจ์ด๋ ๋ ์์๋ด์ผ๊ฒ ์ง๋ง, ๊ธฐ๋ถ์ด ์ข๋ค.
๋์ฌ๊ฒจ ๋ณผ ์ ์ ๊ฐ๋ฅํ ์ธ๋ฑ์ค๊ฐ 2๊ฐ์ง๋ง, ์ค๋ณต๋๋ ์ธ๋ฑ์ฑ์ด ์์ด ๋ณตํฉ ์ธ๋ฑ์ค ํ๋๋ง ์ฌ์ฉํ๋ค๋ ์ ์ด๋ค.
๋ญํน์ ๋ํ ์ธ๋ฑ์ฑ์ ๋ง์ณค๋ค.
๋์ค์ ๋ญํน์ ๋ถ๊ธฐ๋ ๋ฌ ๋ณ๋ก ์ด์ํด, ๋ ์ ์ ๋ฒ์๋ก ์ค์ฌ์ ๊ฒ์ํ ์๋ ์์ ๊ฒ์ด๋ค.
์๋ฌธ์
range scan ํ์ฉ
์ด๋ฐ๊ฒ๋ ๊ฐ๋ฅํ์ง ์์๊น?
50๋ฑ์ ์ ์๋ฅผ ์ ์ฅํ๋ค โ 60์ ์ด๋ผ๊ณ ํ๋ฉด
์์ผ๋ก ์์๋ฅผ ๋ผ ๋๋ 60์ ์ด์๋ผ๋ฆฌ๋ง ๋ด๋ฉด ๋๋ค. โ ์ฌ๊ธฐ์ ๋ 50๋ฑ์ ์ ์๋ฅผ ์ ์ฅํ๋ค.
์ปค๋ฒ๋ง ์ธ๋ฑ์ค?
์๋ํ์ง ์์์ง๋ง, ์ฟผ๋ฆฌ์ ์ฐ์ด๋ session_id, is_ended, score ๋ชจ๋ ์ธ๋ฑ์ฑ๋์๋ค.
์ด๊ฑธ โ์ปค๋ฒ๋ง ์ธ๋ฑ์คโ๋ผ๊ณ ํ๋๊ฑด๊ฐ?