Home > DB > πŸ’Ύ[Database] μ˜€ν”„μ…‹(Offset)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ[Database] μ˜€ν”„μ…‹(Offset)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Database Database Optimization

πŸ’Ύ[Database] μ˜€ν”„μ…‹(Offset)μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ“Œ Intro.

  • β†˜οΈŽ μ˜€ν”„μ…‹(Offset)은 λ°μ΄ν„°λ² μ΄μŠ€ μΏΌλ§μ„œ κ²°κ³Ό 집합 쀑 νŠΉμ • μœ„μΉ˜μ—μ„œλΆ€ν„° 데이터λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” 기쀀점을 μ˜λ―Έν•¨.
    • β†˜οΈŽ 주둜 νŽ˜μ΄μ§•(Paging)을 κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

βœ…1️⃣ μ˜€ν”„μ…‹(Offset)의 핡심 κ°œλ….

1️⃣ 데이터 κ±΄λ„ˆλ›°κΈ°.

  • β†˜οΈŽ OFFSET은 κ²°κ³Ό μ§‘ν•©μ—μ„œ 처음 λͺ‡ 개의 ν–‰(Row)을 κ±΄λ„ˆλ›°κ³  κ·Έ λ‹€μŒλΆ€ν„° 데이터λ₯Ό λ°˜ν™˜ν•¨.

2️⃣ νŽ˜μ΄μ§•κ³Ό ν•¨κ»˜ μ‚¬μš©.

  • β†˜οΈŽ 주둜 LIMIT와 ν•¨κ»˜ μ‚¬μš©λ¨.
  • β†˜οΈŽ LIMIT은 λ°˜ν™˜ν•  λ°μ΄ν„°μ˜ 개수λ₯Ό, OFFSET은 κ±΄λ„ˆλ›Έ ν–‰(Row)의 개수λ₯Ό 지정함.

3️⃣ 0-based Indexing.

  • β†˜οΈŽ μ˜€ν”„μ…‹μ€ 일반적으둜 0λΆ€ν„° μ‹œμž‘ν•¨.
  • β†˜οΈŽ OFFSET 0은 μ²˜μŒλΆ€ν„° λ°˜ν™˜ν•˜λΌλŠ” μ˜λ―Έμž„.

βœ…2️⃣ SQL μ˜ˆμ‹œ.

1️⃣ κΈ°λ³Έ 예제

SELECT * FROM articles LIMIT 10 OFFSET 20;
  • β†˜οΈŽ μ„€λͺ… :
    • β†˜οΈŽ LIMIT 10 : μ΅œλŒ€ 10개의 ν–‰(Row)을 κ°€μ Έμ˜΄.
    • β†˜οΈŽ OFFSET 20 : 첫 20개의 ν–‰(Row)을 κ±΄λ„ˆλ›°κ³ , 21번째 ν–‰λΆ€ν„° λ°˜ν™˜ν•¨.

2️⃣ νŽ˜μ΄μ§• κ΅¬ν˜„

  • β†˜οΈŽ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ κ΅¬ν˜„ν•  λ•Œ OFFSET은 νŠΉμ • νŽ˜μ΄μ§€μ˜ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
    • β†˜οΈŽ 예λ₯Ό λ“€μ–΄:
      • β†˜οΈŽ νŽ˜μ΄μ§€λ‹Ή 데이터 : 10개
      • β†˜οΈŽ 1 νŽ˜μ΄μ§€ : OFFSET 0 LIMIT 10
      • β†˜οΈŽ 2 νŽ˜μ΄μ§€ : OFFSET 10 LIMIT 10
      • β†˜οΈŽ 3 νŽ˜μ΄μ§€ : OFFSET 20 LIMIT 10

βœ…3️⃣ μ˜€ν”„μ…‹μ˜ 문제점.

1️⃣ μ„±λŠ₯ μ €ν•˜.

  • β†˜οΈŽ OFFSET은 κ±΄λ„ˆλ›°μ–΄μ•Ό ν•  λͺ¨λ“  데이터λ₯Ό 읽고 λ‚˜μ„œμ•Ό μ§€μ •λœ ν–‰(Row)을 λ°˜ν™˜ν•¨.
  • β†˜οΈŽ νŽ˜μ΄μ§€ λ²ˆν˜Έκ°€ 컀질수둝 κ±΄λ„ˆλ›Έ 데이터가 λ§Žμ•„μ Έ μ„±λŠ₯이 μ €ν•˜λ¨

2️⃣ λΆˆν•„μš”ν•œ 데이터 읽기.

  • β†˜οΈŽ λͺ¨λ“  데이터λ₯Ό 읽고 λ‚˜μ„œ ν•„μš” μ—†λŠ” 뢀뢄을 μ œμ™Έν•˜λ―€λ‘œ νš¨μœ¨μ μ΄μ§€ μ•ŠμŒ.

3οΈβƒ£πŸ’‘ ν•΄κ²° 방법.

  • β†˜οΈŽ μ»€μ„œ(Cursor) 기반 νŽ˜μ΄μ§• : νŠΉμ • ν–‰(Row)의 ν‚€(Key)λ₯Ό κΈ°μ€€μœΌλ‘œ λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜ν•¨.
  • β†˜οΈŽ μ •λ ¬ ν•„λ“œ ν™œμš© : μ •λ ¬λœ νŠΉμ • IDλ₯Ό 기반으둜 νŽ˜μ΄μ§•ν•¨.

πŸš€ 정리.

  • πŸ“Œ μ˜€ν”„μ…‹(Offset)
    • β†˜οΈŽ κ²°κ³Ό μ§‘ν•©μ—μ„œ λͺ‡ 개의 ν–‰(Row)을 κ±΄λ„ˆλ›°κ³  λ°˜ν™˜ν• μ§€λ₯Ό μ§€μ •ν•˜λŠ” ν‚€μ›Œλ“œμž„.
  • πŸ“Œ 주둜 LIMITκ³Ό ν•¨κ»˜ μ‚¬μš©λ˜μ–΄ νŽ˜μ΄μ§•μ„ κ΅¬ν˜„ν•¨.
  • πŸ“Œ 문제점
    • β†˜οΈŽ λŒ€λŸ‰μ˜ 데이터λ₯Ό λ‹€λ£° λ•Œ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 있음.
  • πŸ“Œ ν•΄κ²°μ±…
    • β†˜οΈŽ μ»€μ„œ(Cursor) 기반 νŽ˜μ΄μ§• λ˜λŠ” μ •λ ¬ ν•„λ“œλ₯Ό ν™œμš©ν•œ νŽ˜μ΄μ§• μ „λž΅μ„ κ³ λ €.
  • μ˜€ν”„μ…‹μ€ λ°μ΄ν„°λ² μ΄μŠ€ νŽ˜μ΄μ§•μ˜ 핡심 κ°œλ…μ΄μ§€λ§Œ, 상황에 따라 λ‹€λ₯Έ νŽ˜μ΄μ§• μ „λž΅μ„ μ‚¬μš©ν•  ν•„μš”κ°€ 있음.