๋ชฉ์ฐจ
๋ฐฐ๊ฒฝ
์ ํฌ ๋ชจ๋ฝ์์๋ ์ญํ ์ ํ๊ธฐ ๊ธฐ๋ฅ ์ค ์ญํ ๊ธฐ๋ก ์กฐํ API ์์ ์๋ ํ๋ฐฉ ์ฟผ๋ฆฌ๋ ์๋ธ ์ฟผ๋ฆฌ๊ฐ 2๊ฐ๊ฐ ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ ๋นํจ์จ์ ์ด์๊ณ , ์ด๋ฅผ 4๊ฐ์ ์ฟผ๋ฆฌ๋ก ๋๋์ด ์ฑ๋ฅ์ ๊ฐ์ ํ์์ต๋๋ค. ์ด 4๊ฐ์ ์ฟผ๋ฆฌ ์ค ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ค์ ๋นํด ์ ๋ํ ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๊ฐ ์์๋๋ฐ์, ๋ฐ๋ก ์กฐ๊ฑด์ , ๊ทธ๋ฃนํ, ์ ๋ ฌ์ด ๋ชจ๋ ๋ค์ด๊ฐ ์ฟผ๋ฆฌ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค์ ์ธ๋ํค ์ธ๋ฑ์ค๋ก๋ ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ํ์ง ์์ ๋ค๋ฅธ ๊ธฐ๋ณธ ์กฐํ ์ฟผ๋ฆฌ์ ๋นํด ์ฝ 60๋ฐฐ์ ๋ ์์ ์๊ฐ์ด ๋ฐ์ํ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ํด๋น ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ต๋ํ ๋์ด์ฌ๋ ค๋ณด๊ณ ์ ์ต์ ์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๋ณด๊ธฐ๋ก ํ์์ต๋๋ค.
ํ ์คํธ ํ๊ฒฝ
โข
ํ
์คํธ DB ํ๊ฒฝ
โฆ
ํ
์คํธ DB ํ๊ฒฝ์ผ๋ก๋ ๋ก์ปฌย docker์ย mysql์ ๋์, ํ๋ก์ ํธ์ ๋์ผํ๊ฒ DB๋ฅผ ์ค์ ํด ์งํํ์์ต๋๋ค. MySQL ์ 8 ๋ฒ์ ์ ์ฌ์ฉํ์์ต๋๋ค.
โข
DB erd
โฆ
์กฐํํ ํ
์ด๋ธ์ธ role_history ์ role ํ
์ด๋ธ์ PK ๊ฐ ์ธ๋ํค๋ก ์กด์ฌํฉ๋๋ค.
โข
๋๋ฏธ ๋ฐ์ดํฐ ์ ๋ณด
โฆ
role: 100
โฆ
role_history: 50000 * 100
โช
ํ๋์ role ๋น role_history ๋ฅผ 50000 ๊ฑด์ฉ ์ฝ์
ํ์์ต๋๋ค.
โช
role ์ ๊ฐ role_history ๋ง๋ค ์์ฑ ์๊ฐ ์ฐจ์ด๋ 1๋ถ์ผ๋ก ๋์์ต๋๋ค.
๋ฌธ์ ์
ํ์ฌ ๋ค๋ฃจ๋ ์ญํ ๊ธฐ๋ก ์กฐํ ๋ ๋งค๋ฒ ๊ฐฑ์ ํ ์ ์๋ ์ญํ ๋ค์ ์ผ๋ณ ๊ฐ์ฅ ๋ฆ๊ฒ ๊ฐฑ์ ํ ์ญํ ์ ์กฐํํ๋ API ์
๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ๋ฃจ์ 100 ๋ฒ์ ์ญํ ๊ฐฑ์ ์ ํ๋ค๊ณ ํ๋๋ผ๋, ๊ทธ ๋ ๊ฐ์ฅ ๋ฆ๊ฒ ๊ฐฑ์ ํ ์ญํ ์ด ํด๋น ๋ ์ง์ ์ญํ ๋ก ์กฐํ๋ฅผ ํฉ๋๋ค. ์ด๋ฌํ API ์์ ์ญํ ์ ์กฐํํ๊ณ , ๊ทธ๋ฃนํ์ ์ ๋ ฌํ๋ ์กฐํ๋ฅผ ํ ๋ค, ์ต์ข
์ ์ผ๋ก ์กฐํ๋ ์ญํ ํ์คํ ๋ฆฌ์ ํด๋นํ๋ ์ญํ ๊ฒฐ๊ณผ๋ฅผ ์กฐํ๋ฅผ ํ๋๋ฐ, ๋ฌธ์ ๊ฐ ๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
select
max(rolehistor0_.id) as col_0_0_
from
role_history rolehistor0_
where
rolehistor0_.role_id=17
group by
date(rolehistor0_.date_time)
order by
date(rolehistor0_.date_time) desc;
SQL
๋ณต์ฌ
์์ ์ฟผ๋ฆฌ๋ where + group by + order by desc ๊ฐ ์์ฌ ์ฟผ๋ฆฌ์ ๊ธธ์ด์ ๋นํด ๋ค์ ๋ณต์กํ ์ฟผ๋ฆฌ์
๋๋ค. ์กฐ๊ธ ๋ ์์ธํ ๋ณด๋ฉด ์ธ๋ํค๋ก ์๋ role_id ๋ก ์กฐ๊ฑด์ ํํฐ๋ง์ ํ๋ฉฐ, date_time์ date ๋ก ๋ณํํ์ฌ ๊ทธ๋ฃนํ๋ฅผ ํ ๋ค date_time ์ญ์ ์ฆ ์ต์ ๋ ์ง ์์ผ๋ก ์ ๋ ฌ์ ํ๊ณ , ๊ทธ๋ฃนํ๋ date_time ์์ ๊ฐ์ฅ id ๊ฐ ํฐ ๋ฐ์ดํฐ(๋ ์ง ๋ณ ๊ฐ์ฅ ๋ฆ๊ฒ ๊ฐฑ์ ํ ์ญํ ) ๋ฅผ ์กฐํํฉ๋๋ค.
์ ์ฟผ๋ฆฌ์ ์คํ ์๋๋ ๋๋ฏธ ๋ฐ์ดํฐ ์ฝ 500๋ง๊ฑด์ ๊ธฐ์ค์ผ๋ก ์ฝ 0.64์ด๊ฐ ์์๋์์ต๋๋ค. ์๋ธ์ฟผ๋ฆฌ๊ฐ ์์ธ ํ๋ฐฉ ์ฟผ๋ฆฌ๋ณด๋ค๋ ์ฑ๋ฅ์ ํจ์ฌ ์ข์์ง๋ง, ์๋ต๋ ๋ ์ฝ๋ ์์ ๋นํด์๋ ๋ค์ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด ์ฌ์ค์
๋๋ค.
์ฟผ๋ฆฌ ํ๋กํ์ผ๋ง์ ํตํด ํด๋น ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ์ํ์ธ์ง ํ์ธํด ๋ณด์์ต๋๋ค.
์ปจํ
์คํธ ์ค์์นญ์ด ๋ฐ์ํ๋ ๋น๋๋ฅผ ๋ํ๋ด๋ context_voluntary ์ context_involuntary ์ปฌ๋ผ์์ ๊ฐ๊ฐ ์ฝ 100 ๊ฑด๊ณผ 200 ๊ฑด์ด ๋ฐ์ํ์์ต๋๋ค. ์ด ๋ํ ์ด์ ํ๋ฐฉ ์ฟผ๋ฆฌ์ ์ปจํ
์คํธ ์ค์์นญ ์์ธ ์ฝ 10000๊ฑด์ ๋นํด์๋ 1% ์์ค์ด์ง๋ง, 35๊ฑด ๋ฐ์ดํฐ ์๋ต ์์ ๋นํด์๋ ๋ง์ ํธ์ ์ํฉ๋๋ค. ์ด๋ฌํ ๋ถ์ ๊ฒฐ๊ณผ๋ก๋ CPU ์
์ถ๋ ฅ์ด ๋ง์ด ๋ฐ์ํ์ฌ ์๊ฐ์ด ์ค๋ ์์๋์๋ค๊ณ ํ๋จํ์์ต๋๋ค. ํ์ฌ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ์ฌ์ฉํ๋ InnoDB ์์ CPU ์
์ถ๋ ฅ์ ์ค์ผ ์ ์๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐฉ์์ ์์ฃผ ์กฐํ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ฌ ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ์์
๋๋ค. ์ด์ ๋ฐ๋ผ ํ์ฌ ์ ์ฉ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ธํด๋ณด๊ณ , ์ด๋ค ํํ๋ก ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํด์ผ ๊ฐ์ฅ ํจ์จ์ ์ผ ์ ์๋์ง ์์๋ณด์์ต๋๋ค.
index ์กฐ์ฌ
ํ์ฌ ์์ฑ๋์ด ์๋ ์ธ๋ฑ์ค๋ ์์ 3๊ฐ์
๋๋ค. PRIMARY ์ role_id ๋ ํ
์ด๋ธ์ด ์์ฑ๋ ๋ ์๋์ผ๋ก ์์ฑ๋๋ ์ธ๋ฑ์ค์
๋๋ค. ํ
์ด๋ธ์ด ์์ฑ๋ ๋, Inno DB ๋ ๊ธฐ๋ณธํค์ ์ธ๋ํค์ ๋ํด ์๋์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ํ date_time ํญ๋ชฉ์ผ๋ก ๊ทธ๋ฃนํํ๊ธฐ๋๋ฌธ์ date_time ์ ๋ํด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์์ต๋๋ค. ํ์ง๋ง ์คํ ๊ณํ์ ์ดํด๋ณด๋ฉด!
key ์ปฌ๋ผ์ role_id_index ๋ง ์์ด, ๊ทธ๋ฃนํ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ง ์์ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ธ๋ฑ์ค๋ฅผ ํ์ง ์์ ์ด์ ๋, where ์ ๋๋ group by ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๋์ผํ ์ปฌ๋ผ์ด ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค. ํ์ง๋ง ํ์ฌ ์ ์ฉ๋์ด ์๋ ์ธ๋ฑ์ค๋ ์กฐ๊ฑด์ ๊ณผ ๊ทธ๋ฃนํ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ด ๋ค๋ฅด๊ธฐ๋๋ฌธ์ ๊ทธ ์ค ํ๋๋ง ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋ ๊ฒ์
๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค ์ ์ฉ
์ด์ ๋ฐ๋ผ ์กฐ๊ฑด์ ๊ณผ ๊ทธ๋ฃนํ๊ฐ ๋ชจ๋ ์ธ๋ฑ์ค์ ์ ์ฉ๋ ์ ์๋๋ก ์ปฌ๋ผ ์์(role_id, datetime)์ ๋ง์ถ์ด ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์์ต๋๋ค.
create index role_history_index_role_id_date_time on role_history (role_id, date_time);
SQL
๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ์คํ ๊ณํ์ ํ์ธํด๋ณด๋ฉด!
key ์ปฌ๋ผ์ ๋ฐฉ๊ธ ์์ฑํ (role id, date time) ์ ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Extra ์ปฌ๋ผ์ ์ถ๊ฐ์ ์ผ๋ก Using index ๊ฐ ํฌํจ๋์์ต๋๋ค. Extra ์ปฌ๋ผ์ Using index ๋ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์๋ค๋ ํ๊ธฐ์
๋๋ค.
์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ ์กฐํํ ์ปฌ๋ผ, ์กฐ๊ฑด์ , ๊ทธ๋ฃนํ, ์ ๋ ฌ ๋ฑ์ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ด ์์์ ๋ง๊ฒ ๋ชจ๋ ์ธ๋ฑ์ค์ ํฌํจ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ์ธ๋ฑ์ค๋ก ์ ์ฅ๋์ด ์๊ธฐ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผํ ํ์๊ฐ ์์ด ์ฟผ๋ฆฌ์ ํจ์จ์ด ๋งค์ฐ ์ข์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ์ฌ ๋ณตํฉ ์ธ๋ฑ์ค์ ์ค์ ๋ ์ปฌ๋ผ์ โrole_idโ ์ โdate_timeโ ์ด๊ณ , ์กฐํํ๋ ์ปฌ๋ผ์ โidโ ์ฌ์ ์ ์ฉ๋ ๋ณตํฉ ์ธ๋ฑ์ค์๋ id ๊ฐ ์๋๋ฐ, ์ด๋ป๊ฒ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค ์ ์ฉ์ด ๊ฐ๋ฅํ์๊น์?
์ด๋ Inno DB ์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค(Non-Clustering Index)์ ํน์ํ ๊ตฌ์กฐ ๋๋ถ์
๋๋ค. Inno DB ์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ๋ฆฌํ ๋
ธ๋์๋ ํด๋น ๋ ์ฝ๋์ ๋ฐ์ดํฐ ์ฃผ์๊ฐ ์๋ ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค์ ๊ฐ(PK)์ ์ ์ฅํ๋๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ธ ๋ณตํฉ ์ธ๋ฑ์ค์ ๋ฆฌํ ๋
ธ๋์๋ role_history ํ
์ด๋ธ์ PK ์ธ id ๊ฐ์ด ์ ์ฅ๋์ด ์๊ธฐ๋๋ฌธ์ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ ์์ด ์ธ๋ฑ์ค๋ง์ผ๋ก ์กฐํ๊ฐ ๊ฐ๋ฅํ์ฌ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋ ๊ฒ์
๋๋ค.
์ปค๋ฒ๋ง ์ธ๋ฑ์ค ์ ์ฉ์ผ๋ก ์ธํด ์ฑ๋ฅ์ด 0.64 โ 0.09 ๋ก ์ฝ 7๋ฐฐ ํฅ์๋์์ต๋๋ค. ํ์ง๋ง ์์ง ๋์ ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ต๋๋ค. Extra ํ๋์ Using index ์ด์ธ์, ์ฒ์๋ถํฐ ๋ฌ๊ณ ๋ค๋ Using temporary ์ Using filesort ๊ฐ ํ๊ธฐ๋์ด ์์ต๋๋ค.
โข
Using temporary
โฆ
๋ ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํ๊ฑฐ๋ ์ ๋ ฌํ ๋ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด ์ํํฉ๋๋ค.
โฆ
์ฒ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋์๋ค๊ฐ, ์ฒ๋ฆฌํด์ผ ํ ๋ฐ์ดํฐ์ ์์ด ์ปค์ง๋ฉด ๋์คํฌ์ ์ ์ฅ๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
โข
Using filesort
โฆ
์ธ๋ฑ์ค๋ก ์ ๋ ฌ๋์ด ์์ง ์์ ๋ ์ฝ๋๋ฅผ ์ ๋ ฌํฉ๋๋ค.
์์ ๋ ์ ๋ณด๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํค๋ ํญ๋ชฉ์
๋๋ค. Using temporary ์ Using filesort ๊ฐ ๋ฐ์ํ ๊ฒ์ ๊ทธ๋ฃนํ/์ ๋ ฌ ์ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์๋ ์กฐ๊ฑด์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋๋ฐ ์ด๋ฒ ๊ฒฝ์ฐ์์๋ ์ธ๋ฑ์ค ์ปฌ๋ผ์ ๋ณํํ์ฌ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์์์ต๋๋ค. ํ์ฌ ๊ทธ๋ฃนํ์ ์ ๋ ฌ ์ ์ด์ฉํ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ก ์ค์ ํ date_time ์ด ์๋๋ผ, ๋น์ฆ๋์ค ์ ์ฑ
์ ๋ ์ง๋ก ๋ณํ์ด ํ์ํ date(date_time) ์
๋๋ค. ์ด์ ๋ฐ๋ผ ๋ณํ๋ ์ปฌ๋ผ์ ๊ทธ๋ฃนํ/์ ๋ ฌํ๊ธฐ ์ํด Using temporary ์ Using filesort ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค.
date ์ปฌ๋ผ ์ถ๊ฐ
์ด์ ๋ฐ๋ผ Using temporary ์ Using filesort ๋ฅผ ์์ ๊ธฐ ์ํด ๊ธฐ์กด date_time ์ ๊ธฐ๋ฐ์ผ๋ก, ์๋ก์ด date ์ปฌ๋ผ์ ๋ง๋๋ ๋ฐ์ ๊ทํ๋ฅผ ์งํํ๊ธฐ๋ก ํ์์ต๋๋ค. ๋น๋ก ๋ฐ์ดํฐ ์๋ฏธ๊ฐ ์ค๋ณต๋์ด ์ ์ฅ๋๋ ๋จ์ ์ด ์์ง๋ง, ์กฐํ ์ฑ๋ฅ์ด ์ฌ์ฉ์ ์
์ฅ์์ ๋ ์ค์ํ๋ค๊ณ ํ๋จํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ์์ฑํ date ์ปฌ๋ผ์ด ํฌํจ๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์์ต๋๋ค.
alter table role_history add date date;
update role_history set date=date(date_time);
create index role_history_index_role_id_date on role_history (role_id, date);
SQL
๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฃนํ์ ์ ๋ ฌํ๋ ์ปฌ๋ผ์ ์๋ก ์์ฑํ date ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝํ ๋ค ์คํ ๊ณํ์ ์ดํด๋ณด๋ฉด,
select
max(rolehistor0_.id)ascol_0_0_
from
role_history rolehistor0_
where
rolehistor0_.role_id=17
group by
date
order by
date desc;
SQL
๋ณต์ฌ
๊ณ์ ํน์ฒ๋ผ ๋ฌ๊ณ ๋ค๋๋ Using temporary ์ Using filesort ๋ฅผ ๋๋์ด ๋ผ์ด๋ผ ์ ์์์ต๋๋ค! ๋ํ ์ฑ๋ฅ๋ 0.09 โ 0.03 ์ผ๋ก 3๋ฐฐ ๋ ๊ฐ์ ํ ์ ์์์ต๋๋ค. ํ์ง๋ง Backward index scan ์ด๋ผ๋ ์๋ก์ด ์์ ํน์ด ์๋ก ๋ฐ์ํ์์ต๋๋ค. ๋น์ฆ๋์ค ์ ์ฑ
์, ๋ ์ง๋ฅผ ์ต์ ์์ผ๋ก ์ ๋ ฌํ์ฌ ์๋ตํ๊ธฐ๋๋ฌธ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ์ด์ฉํ์๊ณ , ์ด๋ก ์ธํด ์ธ๋ฑ์ค๋ฅผ ๋ค์์ ๋ถํฐ ์ฝ๋ Backward index scan ์ด ๋ฐ์ํ์์ต๋๋ค.
์ญ์ ์ธ๋ฑ์ค ์ค์
MySQL ์์๋ ์ธ๋ฑ์ค ์ญ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ๋ค๋ง 8.0 ์ด์ ๋ฒ์ ์์๋ ๋ฌธ๋ฒ์์ผ๋ก๋ง ์ง์์ ํ๊ณ ์ค์ ๋ก๋ ์ง์๋์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ 8.0 ๋ฒ์ ๋ถํฐ๋ ์ญ์ ์ธ๋ฑ์ค ์ ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค. ์ญ์ ์ธ๋ฑ์ค์ ๋ํ ๋์ฑ ์์ธํ ๋ด์ฉ์ MySQL Ascending index vs Descending index ์์ ์ ์ ์๋๋ฐ์, ํด๋น ํ์ด์ง์ ๋ด์ฉ์ ์์ฝํ์๋ฉด, ์ธ๋ฑ์ค ํ์ด์ง ๊ตฌ์กฐ๋ double linked list ์ฌ์ ์์์ ์ฝ๋ ์ญ์์ผ๋ก ์ฝ๋ ์ฑ๋ฅ์ด ๊ฐ์ ๊ฒ ๊ฐ์๋ฐ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์๋ ์ด์ ๋ 1. ํ์ด์ง ์ ๊ธ์ด forward index scan ์ ์ ํฉํ ๊ตฌ์กฐ์ด๊ณ , 2. '์ธ๋ฑ์ค ํ์ด์ง ๋ด'์์๋ ์ธ๋ฑ์ค ๋ ์ฝ๋๊ฐ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ forward index scan ๊ณผ backward index scan ์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์ฟผ๋ฆฌ๊ฐ ํ๋์ ์ธ๋ฑ์ค ํ์ด์ง์ ์ง์ค๋๋ ์ํฉ์ธ ๊ฒฝ์ฐ์
๋๋ค. ์ด ์ํฉ์์ ํ์ด์ง ์ ๊ธ์ ํ๋ํ๊ธฐ ์ํ ์ฐ๋ ๋๋ผ๋ฆฌ์ ๊ฒฝํฉ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ฌ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-- ์ธ๋ฑ์ค: tid desc
set @random_tid=floor(rand()*12994454);
select tid from t1 where tid<=@random_tid order by tid DESC limit 50;
-- ์ถ์ฒ: https://tech.kakao.com/2018/06/19/mysql-ascending-index-vs-descending-index/
-- ์ธ๋ฑ์ค: language, rental_datetime desc
select title, rental_datetime from rentals where language = 'Italian' order by rental_datetime desc;
-- ์ถ์ฒ: https://medium.com/naver-cloud-platform/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EC%84%B8%EC%9A%94-mysql-8-0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-3-indexes-e32249e2dae5
SQL
๋ณต์ฌ
๋ ์ฟผ๋ฆฌ ๋ชจ๋ ์กฐ๊ฑด์ ์์ ํํฐ๋ง๋์ด ํ๋์ ์ธ๋ฑ์ค ํ์ด์ง์ ์ง์ค๋๋ ์ํฉ์
๋๋ค. ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ๋ ค๋ ์ฟผ๋ฆฌ์ ๋ง์ด ๋ฎ์ ์์ต๋๋ค. ํ์ฌ์ ์ฟผ๋ฆฌ๋ role_id ๋ก ์กฐ๊ฑด์ ํํฐ๋ง์ ํ๊ธฐ๋๋ฌธ์ ํํฐ๋ง๋ role_id ๋ฅผ ๊ฐ์ง ์ธ๋ฑ์ค ํ์ด์ง์ ์ง์ค๋๋ ์ํฉ์
๋๋ค. ์ด์ ๋ฐ๋ผ ์ญ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ ํ์๊ฐ ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.
create index role_history_index_role_id_date_desc on role_history (role_id, date desc);
SQL
๋ณต์ฌ
Backward index scan ์์ด ๊น๋ํ๊ฒ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ ์ ์์์ต๋๋ค. ๋ํ ์๋๋ 0.03 โ 0.02 ๋ก ์ฝ 50% ๊ฐ์ ํ ์ ์์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
MySQL ์ ์คํ ๊ณํ์ผ๋ก ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋ ์ ์ฉ๋ ์ธ๋ฑ์ค์ ์ต์ ํ ์ต์
์ ํ์ธํ๊ณ , ์ฟผ๋ฆฌ ํ๋กํ์ผ๋ง์ ์ด์ฉํ์ฌ ์ค์ ๋ก ์คํ๋ ์ฟผ๋ฆฌ์ ์ํ ์๋์ ์๋์ ์ํฅ์ ๋ฏธ์น๋ ์ปจํ
์คํธ ์ค์์นญ ์๋ฅผ ํ์ธํด ๋ณด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณตํฉ ์ธ๋ฑ์ค์ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ฌ where + group by + order by ๊ฐ ํฌํจ๋ ๋ณต์กํ ์ฟผ๋ฆฌ์ ์๋๋ฅผ ๊ฐ์ ํด ๋ณด์์ต๋๋ค.
ํ์ง๋ง ํ์ฌ๋ ์์ฌ์ด ์ ์ด ์กด์ฌํฉ๋๋ค. ์ธ๋ฑ์ค๋ก ์ ์ฅํ role id ์ปฌ๋ผ๊ณผ date ๋ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ง ์์ ์ธ๋ฑ์ค์ ํจ์จ์ด ์๋์ ์ผ๋ก ์ข์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ฌ๋ถ์ ์ธ๋ฑ์ค ์ ์ฅ ๊ณต๊ฐ(ํต์ ์ฝ 10%)์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ
์ ์์ ๊ฐ์ด ๋ณต์กํ ๊ธฐ์ ์ ์ฉ ์์ด๋, ๋น์ฆ๋์ค ์ ์ฑ
์์ผ๋ก ์ฌ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋๋ก ๊ณ ๋ฏผํ๊ณ ์ ์ฉํ๋ ๊ฒ์
๋๋ค(EO ๊น๋ฒ์ค๋์ ์์์ ์ฐธ๊ณ ํ์์ต๋๋ค). ํ์ง๋ง ๋น์ฆ๋์ค ์ ์ฑ
์์ผ๋ก ๋ถ๊ฐํผํ๊ฒ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋์ด์ผ ํ๋ค๋ฉด ํ์ฌ ํ
์ด๋ธ์์ ์กฐํํ๋ ๋์ , ํด๋น ์ฟผ๋ฆฌ์ ์ต์ ํ๋ ์ปฌ๋ผ์ผ๋ก ์๋ก์ด ํ
์ด๋ธ์ ๋ง๋ค์ด ๋ฐ์ ๊ทํ๋ฅผ ์งํํ๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณผ ๋งํ๋ค๊ณ ์๊ฐํด ๋ณด์์ต๋๋ค. ๋ฌผ๋ก ์ด ๋ฐฉ์ ๋ํ ์ค๋ณต๋ ์๋ฏธ์ ์ปฌ๋ผ์ด ์ฌ๋ฟ ์กด์ฌํ๊ฒ ๋๋, ํ๋ก์ ํธ์ ์์๋์ ๋ง์ถฐ ์ด๋ค ๋ฐฉ์์ด ๊ฐ์ฅ ํจ์จ์ ์ผ์ง ๊ณ ๋ฏผํด๋ณด๊ณ ์ ์ฉํด์ผ ํฉ๋๋ค.