MySQL LIMIT ์ฝ๊ฒ ์ดํดํ๊ธฐ! | ํ์ด์ง ์ฒ๋ฆฌ ํต์ฌ ์ ๋ฆฌ
์ด ์์์ MySQL์์ย LIMITย ํค์๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ์กฐํ ์ ํ(row)์ ๊ฐ์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ๊ณผ, ์ด๋ฅผ ํ์ฉํย ํ์ด์ง ์ฒ๋ฆฌ(ํ์ด์ง๋ค์ด์
)ย ๊ตฌํ๋ฒ์ ์ฝ๊ณ ์์ธํ๊ฒ ์ค๋ช
ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ ๋งํผ๋ง ๋ฐ์ดํฐ๋ฅผ ๋์ด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ , ํ์ด์ง๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋์ด ๋ณด์ฌ์ฃผ๋ ์ค์ต๊ณผ ๊ณต์๋ ํจ๊ป ๋ค๋ฃน๋๋ค.
๋ชฉ์ฐจ
1.
2.
3.
4.
5.
6.
7.
LIMIT ํค์๋ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ ๋ฌธ๋ฒ [00:00:17]
โข
LIMIT์ MySQL์์ ์กฐํ ๊ฒฐ๊ณผ์ ํ ๊ฐ์๋ฅผ ์ ํํ๋ ํค์๋์
๋๋ค.
โข
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ย LIMIT [offset,] row_countย ๋๋ย LIMIT row_count OFFSET offsetย ํํ์
๋๋ค.
โข
offset์ ๋ช ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ์์ํ ์ง(0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค),ย row_count๋ ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ์ง ์ง์ ํฉ๋๋ค.
โข
์์:
โฆ
LIMIT 0, 10ย โ 0๋ฒ์งธ(์ฒซ ๋ฒ์งธ) ๋ฐ์ดํฐ๋ถํฐ 10๊ฐ ๊ฐ์ ธ์ค๊ธฐ
โฆ
LIMIT 10, 20ย โ 10๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ 20๊ฐ ๊ฐ์ ธ์ค๊ธฐ (์ค์ ๋ก๋ 11๋ฒ์งธ๋ถํฐ 30๋ฒ์งธ๊น์ง)
ํ์ด์ง ์ฒ๋ฆฌ(ํ์ด์ง๋ค์ด์
) ์ดํดํ๊ธฐ [00:00:47]
โข
ํ์ด์ง ์ฒ๋ฆฌ๋, ํ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ์ง ์๊ณ ํ์ด์ง๋ณ๋ก ๋๋์ด ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์
๋๋ค.
โข
์๋ฅผ ๋ค์ด ํ ํ์ด์ง์ 10๊ฐ์ฉ ๋ณด์ฌ์ฃผ๋ฉด,
โฆ
1ํ์ด์ง๋ย LIMIT 0, 10
โฆ
2ํ์ด์ง๋ย LIMIT 10, 10
โฆ
5ํ์ด์ง๋ย LIMIT 40, 10ย ์ด๋ฐ ์์ผ๋ก ๊ณ์ฐํด์ ์ฌ์ฉํฉ๋๋ค.
โข
ํ์ด์ง ๋ฒํธ์ ๋ฐ๋ผย offset = (ํ์ด์ง๋ฒํธ - 1) * ํ์ด์ง๋น ๋ฐ์ดํฐ ์๋ก ๊ณ์ฐํฉ๋๋ค.
์ค์ต: ์ํ ๋ฐ์ดํฐ ์์ฑ๊ณผ LIMIT ์ฌ์ฉ๋ฒ [00:04:07]
โข
์ฒ ๊ฑด์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ ์ค์ตํฉ๋๋ค.
โข
LIMIT์ ์ฟผ๋ฆฌ ๋์ ๋ถ์ฌ์ ์ํ๋ ๋งํผ ๋ฐ์ดํฐ๋ฅผ ์๋ผ์ ์กฐํํฉ๋๋ค.
โข
์์:ย SELECT * FROM board LIMIT 10;ย โ ์ฒ์ 10๊ฐ ๋ฐ์ดํฐ ์กฐํ
โข
LIMIT์ ํญ์ ์ฟผ๋ฆฌ๋ฌธ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์์นํด์ผ ํ๋ฉฐ,ย ORDER BYย ๋ค์์ ์์ผ ํฉ๋๋ค.
LIMIT ๋ฌธ๋ฒ ์์์ ์์น ์ฃผ์์ฌํญ [00:07:23]
โข
SQL ๋ฌธ๋ฒ ์์:ย SELECTย โย FROMย โย WHEREย โย GROUP BYย โย ORDER BYย โย LIMIT
โข
LIMIT์ ํญ์ ๋ง์ง๋ง์ ์จ์ผ ํ๋ฉฐ,ย ORDER BY๊ฐย GROUP BY๋ณด๋ค ์์๊ฑฐ๋ย WHERE๋ณด๋ค ์์๋ฉด ์๋ฌ๊ฐ ๋ฉ๋๋ค.
โข
๋ฐ๋ผ์ย LIMIT์ ๊ฒฐ๊ณผ๋ฅผ ์ต์ข
์ ์ผ๋ก ์๋ฅด๋ ์ญํ ์ ํ๋ฏ๋ก ๊ฐ์ฅ ๋ง์ง๋ง์ ์์นํด์ผ ํฉ๋๋ค.
ํ์ด์ง ๊ณ์ฐ ๊ณต์๊ณผ ์์ [00:13:23]
โข
ํ์ด์ง ์ฒ๋ฆฌ์ ํ์ํ ํ์ ๋ฐ์ดํฐ:
1.
ํ์ฌ ํ์ด์ง ๋ฒํธ
2.
ํ์ด์ง๋น ๋ณด์ฌ์ค ๋ฐ์ดํฐ ๊ฐ์
3.
์ ์ฒด ๋ฐ์ดํฐ ์
4.
๋
ธ์ถํ ํ์ด์ง ๊ฐ์(์: ํ ๋ฒ์ ๋ช ๊ฐ์ ํ์ด์ง ๋ฒํผ์ ๋ณด์ฌ์ค์ง)
โข
์ฃผ์ ๊ณต์:
โฆ
๋ง์ง๋ง ํ์ด์ง ๋ฒํธ (last page)last = ((์ ์ฒด ๋ฐ์ดํฐ ์ - 1) / ํ์ด์ง๋น ๋ฐ์ดํฐ ์) + 1์) 231๊ฑด ๋ฐ์ดํฐ, 10๊ฐ์ฉ โย (231-1)/10 + 1 = 24ํ์ด์ง
โฆ
์์ ์ธ๋ฑ์ค (offset)offset = (ํ์ฌ ํ์ด์ง ๋ฒํธ - 1) * ํ์ด์ง๋น ๋ฐ์ดํฐ ์
โฆ
์์ ํ์ด์ง ๋ฒํธ ๊ณ์ฐ (ํ์ด์ง ๋ฒํผ ๊ทธ๋ฃน ์์ ๋ฒํธ)startPage = ((ํ์ฌ ํ์ด์ง ๋ฒํธ - 1) / ๋
ธ์ถ ํ์ด์ง ๊ฐ์) * ๋
ธ์ถ ํ์ด์ง ๊ฐ์ + 1
โฆ
๋ ํ์ด์ง ๋ฒํธ ๊ณ์ฐendPage = startPage + ๋
ธ์ถ ํ์ด์ง ๊ฐ์ - 1ย (์ ์ฒด ํ์ด์ง ์๋ฅผ ๋์ง ์๋๋ก ์กฐ์ )
ํ๋ก๊ทธ๋จ์์ ํ์ด์ง ์ฒ๋ฆฌ ๊ตฌํ ํ [00:19:11]
โข
ํ์ด์ง ์ฒ๋ฆฌ๋ ๋ณดํต ํ๋ก๊ทธ๋จ์์ ํ์ฌ ํ์ด์ง ๋ฒํธ์ ํ์ด์ง๋น ๋ฐ์ดํฐ ์๋ฅผ ๋ฐ์ ๊ณ์ฐ ํ,๊ณ์ฐ๋ย offset๊ณผย row_count๋ฅผ ์ฟผ๋ฆฌ์ย LIMIT์ ๋๊ฒจ์ค๋๋ค.
โข
์๋ฅผ ๋ค์ด, 3ํ์ด์ง์ 10๊ฐ์ฉ ๋ณด์ฌ์ฃผ๋ ค๋ฉดย LIMIT 20, 10ย (0๋ถํฐ ์์ํ๋ฏ๋ก (3-1)*10=20)
โข
ํ์ด์ง ๋ฒํผ์ ํ๋ฉด์ ์ถ๋ ฅํ ๋๋ ์์ ํ์ด์ง๋ถํฐ ๋ ํ์ด์ง๊น์ง ๋ฐ๋ณต๋ฌธ์ ๋๋ ค ๋ฒํผ์ ๋ง๋ญ๋๋ค.
โข
์ด์ ํ์ด์ง, ๋ค์ ํ์ด์ง ๋ฒํผ์ ํ์ฌ ํ์ด์ง์์ -1, +1 ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
MySQL LIMIT vs ๋ค๋ฅธ DBMS ํ์ด์ง ์ฒ๋ฆฌ ๋น๊ต [00:21:05]
โข
MySQL์ย LIMITย ํค์๋ ๋๋ถ์ ํ์ด์ง ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ์ฝ๊ณ ๊ฐ๋จํฉ๋๋ค.
โข
๋ฐ๋ฉด, ์ค๋ผํด(Oracle) ๊ฐ์ DBMS๋ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋ธ์ฟผ๋ฆฌ๋ ๋ณต์กํ ๊ณ์ธตํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํด์ ์ด๋ ต์ต๋๋ค.
โข
๋ฐ๋ผ์ MySQL์ ์น ๊ฐ๋ฐ ๋ฑ์์ ํ์ด์ง ์ฒ๋ฆฌ์ ๋งค์ฐ ์ ํฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
๋๋ค.
๋ง๋ฌด๋ฆฌ ์์ฝ
MySQL์ย LIMITย ํค์๋๋ ๋ฐ์ดํฐ ์กฐํ ์ ์ํ๋ ํ์ ๊ฐ์๋ฅผ ์ ํํ๋ ์์ฃผ ์ ์ฉํ ๊ธฐ๋ฅ์
๋๋ค. ํนํ ํ์ด์ง ์ฒ๋ฆฌ(ํ์ด์ง๋ค์ด์
)๋ฅผ ๊ตฌํํ ๋ ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ,ย LIMIT offset, row_countย ๋ฌธ๋ฒ์ ํตํด ์ฝ๊ฒ ํน์ ์์น๋ถํฐ ์ํ๋ ๊ฐ์๋งํผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์์ ํ์ฌ ํ์ด์ง ๋ฒํธ์ ํ์ด์ง๋น ๋ฐ์ดํฐ ์๋ฅผ ๋ฐ์ ๊ณ์ฐํย offsetย ๊ฐ์ ์ฟผ๋ฆฌ์ ๋๊ฒจ์ฃผ๋ฉด, ๋ณต์กํ ํ์ด์ง ์ฒ๋ฆฌ๋ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ต๋๋ค. MySQL ๋๋ถ์ ํ์ด์ง ์ฒ๋ฆฌ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค๋ ์ , ๊ผญ ๊ธฐ์ตํ์ธ์!
๊ถ๊ธํ ์ ์์ผ๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์! ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์~ 