์ฟผ๋ฆฌ ์ฑ๋ฅ ๊ฐ์ ์ ์ฟผ๋ฆฌ๋ฌธ ๋ด์์ Join๋ฌธ๊ณผ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด ์ ๋ถ์ธ์ค ์์๋ ๋...
์ด๋ฒ ์ฟผ๋ฆฌ ์ฑ๋ฅ ๊ฐ์ ์ ํตํด ์ธ๋ฑ์ค ์ต์ ํ, ์ค๋ฉ, ํํฐ์ ๋, ์บ์ฑ, ์ ๊ทํ์ ๋น์ ๊ทํ ๋ฑ ์ ๋ง ๋ง์ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ์ฟผ๋ฆฌ ๊ฐ์ ์ ํฅ๋ฏธ๊ฐ ๋ถ๊ธฐ ์์ํ๋ค. ์ด๋ฒ ์ฑ๋ฅ ๊ฐ์ ์์ ๋ด๊ฐ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์ธ๋ฑ์ค ์ต์ ํ์ด๋ค.
๋จผ์ ์ธ๋ฑ์ค์ ๋ํ ๊ฐ๋ ๋ค์ ์ง๊ณ ๋์ด๊ฐ์
๊ฐ์ ํ๊ณ ์ ํ๋ API๋ 'ํ๋' ํ ์ด๋ธ์ ์กฐํํ๋ ํ์ด์ง API์ด๋ค. ํด๋น API๋ Count ์ฟผ๋ฆฌ์ ์ผ๋ฐ ์กฐํ ์ฟผ๋ฆฌ, ์ด 2๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
โ๏ธ ์กฐํ ์ฟผ๋ฆฌ
1๏ธโฃ ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค ์ฌ์ฉ
๋จผ์ ์ฟผ๋ฆฌ ๊ฐ์ ์ ์ํด์๋ ์คํ๊ณํ์ ํตํด ์ฟผ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง๋ฅผ ํ์ธํด์ผํ๋ค.
- type - ALL : ์ธ๋ฑ์ค๋ฅผ ํ์ง ์์ ํ ์ด๋ธ ํ์ค์บ์ ์๋ฏธํ๋ค.
- Using filesort : ORDER BY๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์์ง๋ง ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ, MySQL์์ ์ ๋ ฌ์ ํ ๋ฒ ํด์ผํ๋๋ฐ ์ํธ ๋ฒํผ์ ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ์ ๋ ฌํ๋ ๋นํจ์จ์ ์ธ ์์
์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ํ์ฌ created_at์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ์ค id๊ฐ์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ๊ณผ ์๋ฏธ์์ ์ฐจ์ด๊ฐ ์๋ค. ํ์ง๋ง ์ธ๋ฑ์ค์ ๋ํ ์ง์์์ด ๊ตฌํํ ๋น์, created_at์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๊ฒ ๋ ์ง๊ด์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ์ด๋ฅผ id๊ฐ ๊ธฐ์ค ์ ๋ ฌ๋ก ๋ฐ๊พผ๋ค๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค์ธ Primary index๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ด ๊ฐ๋ฅํ๋ค.
- ์์ ํ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ๊ณผ Profiling์ ํตํด ์ป์ ํ
์คํธ ๊ฒฐ๊ณผ์ด๋ค. ์๋์ 3๊ฐ๊ฐ created_at์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ํ ํ
์ด๋ธ ์ค์บ์ ํ ๊ฒฐ๊ณผ์ด๊ณ , ์์ 3๊ฐ๊ฐ primary index๋ฅผ ํ ๊ฒฐ๊ณผ์ด๋ค. ์ฝ 250% ์ ๋์ ์ฑ๋ฅํฅ์์ ํ์ธํ ์ ์๋ค.
2๏ธโฃ No Offset ๋ฐฉ์
์งํ์ค์ธ ์๋น์ค์ ์กฐํ API๋ ์ผ๋ฐ์ ์ธ ํ์ด์ง ํ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค. ํ ํ์ด์ง๋ฅผ ์กฐํํ ๋๋ง๋ค ์นด์ดํธ ์ฟผ๋ฆฌ๊ฐ ํจ๊ป ์คํ๋์ด totalCount๋ฅผ ๋ฐ์์ค๋ ํ์์ด๋ค. totalCount ๊ฐ์ ์ฟผ๋ฆฌ ์ฒซ ์คํ์์๋ง ๋ณด๋ด์ฃผ๊ณ ํ๋ก ํธ๋จ ์บ์์ ์ ์ฅํด๋๋ฉด ๋์ง ์์๊น ๋ผ๋ ์๊ฐ์ ํ๋ค. ๋ฌผ๋ก ์ด ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ํ์ฌ ์๋น์ค๋ ํ์ด์ง ๋ชฉ์ฐจ๋ฅผ ๋ํ๋ด์ง ์๊ณ ์คํฌ๋กค๊ณผ ๋๋ณด๊ธฐ๋ฅผ ํตํด ์ถ๊ฐ ํ์ด์ง๋ฅผ ๋ํ๋ด์ฃผ๊ณ ์๋ค. ๊ทธ๋ ๋ค๋ฉด totalCount ๊ฐ์ ์ด ๋ช ๊ฐ์ ํญ๋ชฉ์ด ๊ฒ์๋์๋์ง๋ฅผ ๋ช ์์ ์ผ๋ก ๋ํ๋ด์ด์ฃผ๋ ๋ถ๋ถ์ ์ ์ธํ๋ฉด ํ์ํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ๋๋ค. ์์ ๊ฐ์ ์ํฉ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก No Offset ๋ฐฉ๋ฒ์ด๋ค.
์ผ๋ฐ์ ์ธ ํ์ด์ง ๋ฐฉ์์ ๋ท๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์๋ก ๋๋ ค์ง๋๋ค.
์๋ฅผ ๋ค์ด offset 10000, limit 20 ์ด๋ผ ํ๋ฉด ์ต์ข ์ ์ผ๋ก 10,020๊ฐ์ ํ์ ์ฝ์ด์ผ ํ๋ค.
(10,000๋ถํฐ 20๊ฐ๋ฅผ ์ฝ์ด์ผํ๋)
๊ทธ๋ฆฌ๊ณ ์ด ์ค ์์ 10,000 ๊ฐ ํ์ ๋ฒ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
(์ค์ ํ์ํ๊ฑด ๋ง์ง๋ง 20๊ฐ๋ฟ์ด๋)
๋ค๋ก ๊ฐ์๋ก ๋ฒ๋ฆฌ์ง๋ง ์ฝ์ด์ผ ํ ํ์ ๊ฐ์๊ฐ ๋ง์ ์ ์ ๋ค๋ก ๊ฐ์๋ก ๋๋ ค์ง๋ ๊ฒ์ ๋๋ค.
No Offset ๋ฐฉ์์ ๋ฐ๋ก ์ด ๋ถ๋ถ์์ ์กฐํ ์์ ๋ถ๋ถ์ ์ธ๋ฑ์ค๋ก ๋น ๋ฅด๊ฒ ์ฐพ์ ๋งค๋ฒ ์ฒซ ํ์ด์ง๋ง ์ฝ๋๋ก ํ๋ ๋ฐฉ์์ ๋๋ค.
- ์์ ์์ ๋ ์คํ ๊ณํ์ rows๋ฅผ ๋ณด๋ฉด offset์ผ๋ก ์ค์ ํ 5000๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฝ์ด ์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ ์ฝ๋์ ๊ฐ์ด ๊ธฐ์กด์ offset์ ์ ์ฉํ๋ ๋์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ด์ ์ฟผ๋ฆฌ์์ ๋ง์ง๋ง์ผ๋ก ์กฐํ๋ Id๊ฐ์ ๋ฐ์ where ์ ์ ์ ์ฉํ๋ค.
30๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ํ ์คํธ ํ์ ๋์ ๊ฒฐ๊ณผ์ด๋ค. ์์ ๊ฒฐ๊ณผ๊ฐ offset ๋ฐฉ์์ ์ฌ์ฉํ์ ๋์ด๊ณ , ์๋๊ฐ No offset ๋ฐฉ์์ ์ฌ์ฉํ์ ๋์ ๊ฒฐ๊ณผ์ด๋ค. ์ฝ 70๋ฐฐ์ ์ฑ๋ฅํฅ์์ ํ์ธํ ์ ์๋ค.
๐ ๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ง ์์ ์ด์
์ ์ฟผ๋ฆฌ์์๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ๋ ๊ฐ์ ์ฟผ๋ฆฌ์ ์ฌ์ฉํ๋ค. ๋ํ 'ํ๋' ํ ์ด๋ธ ์ปฌ๋ผ๋ค์ ์นด๋๋๋ฆฌํฐ๊ฐ ๋งค์ฐ ๋ฎ๊ณ ๋ฐ์ดํฐ ๋ณ๊ฒฝ(์ฝ์ , ์์ , ์ญ์ ) ์์ ์ด ์์ฃผ ์ผ์ด๋๋ค. ์ด๋ฌํ ์ ๋ค์ ๊ณ ๋ คํ ๋ ๋์ด์์ ์ธ๋ฑ์ค ์์ฑ์ ๋นํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ๋ค.