ããã«ã¡ã¯ãã¿ããªïŒ ç§ã¯ Java + Spring ã§ãã€ã¯ããµãŒãã¹ãäœæããããã¯ãšã³ãéçºè ã§ãã ç§ã¯ãã£ã³ã³ãã®ç€Ÿå 補åéçºããŒã ã® XNUMX ã€ã§åããŠããŸãã
ç§ãã¡ã®ããŒã ã§ã¯ãDBMS ã§ã®ã¯ãšãªã®æé©åã«é¢ããåé¡ãé »ç¹ã«çºçããŸãã åžžã«å°ãã§ãéãããããšèããŠããŸãããæ
éã«æ§ç¯ãããã€ã³ããã¯ã¹ã ãã§åžžã«ããŸããããšã¯éããŸãããããã€ãã®åé¿çãæ¢ãå¿
èŠããããŸãã ããŒã¿ããŒã¹ãæäœããéã®é©åãªæé©åãæ±ã㊠Web ãããŸãã£ãŠãããšãã«ã次ã®ããšãçºèŠããŸããã
ããŒã«ã¹ã®çãèšäºã翻蚳ããããšæããŸãã ããã¯ãSQL æšæºã«åŸã£ããªãã»ããæäœã®ããã©ãŒãã³ã¹ã«é¢ããå€ãããããäŸç¶ãšããŠé¢é£ããåé¡ã«æ³šæãåããããšãããããæå³ãããã§ã¹ããšåŒã¶ããšãã§ããŸãã
ããã€ãã®å Žæã§ãèè ã®èª¬æãšã³ã¡ã³ããè£è¶³ããŸãã ãã®ãããªç®æããã¹ãŠãçŽããšåŒã³ãŸãã ããæ確ã«ããããã«
ç°¡åãªçŽ¹ä»
ãªãã»ããã«ããããŒãžéžæã®äœæ¥ãããã«åé¡ããããé ããã¯å€ãã®äººãç¥ã£ãŠãããšæããŸãã ãããããå¹ççãªèšèšã«ç°¡åã«çœ®ãæããããšãã§ããããšããåç¥ã§ãã?
ãããã£ãŠãoffset ããŒã¯ãŒãã¯ããªã¯ãšã¹ãå ã®æåã® n ã¬ã³ãŒããã¹ãããããããã«ããŒã¿ããŒã¹ã«æ瀺ããŸãã ãã ããããŒã¿ããŒã¹ã¯äŸç¶ãšããŠæåã® n åã®ã¬ã³ãŒããæå®ãããé åºã§ãã£ã¹ã¯ããèªã¿åãå¿ èŠããã (泚: ãœãŒããæå®ãããŠããå Žåã¯ãœãŒããé©çšããŸã)ãããããŠåã㊠n+1 以éã®ã¬ã³ãŒããè¿ãããšãå¯èœã«ãªããŸãã æãèå³æ·±ãã®ã¯ãåé¡ã DBMS ã®ç¹å®ã®å®è£ ã«ããã®ã§ã¯ãªããæšæºã«åŸã£ãå ã®å®çŸ©ã«ãããšããããšã§ãã
âŠè¡ã¯æåã«æ¬¡ã«åŸã£ãŠäžŠã¹æ¿ããããŸãã 次ã«ãã§æå®ãããè¡æ°ãåé€ããããšã§å¶éããŸãã æåãã...
-SQL:2016ãããŒã 2ã4.15.3 掟çããŒãã« (泚: çŸåšæã䜿çšãããŠããæšæº)
ããã§éèŠãªç¹ã¯ãoffset 㯠XNUMX ã€ã®ãã©ã¡ãŒã¿ (ã¹ãããããã¬ã³ãŒãã®æ°) ãåãåãã ãã§ãããšããããšã§ãã ãã®å®çŸ©ã«åŸã£ãŠãDBMS ã¯ãã¹ãŠã®ã¬ã³ãŒããååŸããäžèŠãªã¬ã³ãŒããç Žæ£ããããšããã§ããŸããã æããã«ããã®ãªãã»ããã®å®çŸ©ã«ãããäœåãªäœæ¥ãå¿ èŠã«ãªããŸãã SQL ã NoSQL ãã¯é¢ä¿ãããŸããã
ããå°ãã ãçã¿ãå¢ã
ãªãã»ããã®åé¡ã¯ããã ãã§ã¯ãããŸããããã®çç±ã¯æ¬¡ã®ãšããã§ãã ãã£ã¹ã¯ãã XNUMX ããŒãžã®ããŒã¿ãèªã¿åãéã«ãå¥ã®æäœã§æ°ããã¬ã³ãŒããæ¿å ¥ãããå Žåããã®å Žåã¯ã©ããªããŸãã?
ãªãã»ããã䜿çšããŠåã®ããŒãžããã¬ã³ãŒããã¹ããããããšãç°ãªãããŒãžã®èªã¿åãã®éã«æ°ããã¬ã³ãŒããè¿œå ããç¶æ³ã§ãéè€ãçºçããå¯èœæ§ãé«ããªããŸã (泚: ããã¯ãorder by æ§é ã䜿çšããŠããŒãžããšã«èªã¿åããšãã«çºçããå¯èœæ§ããããŸããåºåã®éäžã§æ°ãããšã³ããªãååŸãããå¯èœæ§ããããŸã)ã
ãã®å³ã¯ãã®ç¶æ³ãæ確ã«ç€ºããŠããŸãã ããŒã¹ã¯æåã® 10 ã¬ã³ãŒããèªã¿åãããã®åŸæ°ããã¬ã³ãŒããæ¿å ¥ãããèªã¿åããããã¹ãŠã®ã¬ã³ãŒãã 1 ã ããªãã»ãããããŸãã次ã«ãããŒã¹ã¯æ¬¡ã® 10 ã¬ã³ãŒãããæ°ããããŒãžãååŸããæ¬æ¥ã§ããã° 11 çªç®ããã§ã¯ãªããæåã®ã¬ã³ãŒãããéå§ããŸãã 10äœããã®èšé²ãåçŸã ãã®è¡šçŸã®äœ¿çšã«é¢é£ããç°åžžã¯ä»ã«ããããŸããããããæãäžè¬çã§ãã
ãã§ã«ããã£ãããã«ããããã¯ç¹å®ã® DBMS ããã®å®è£ ã®åé¡ã§ã¯ãããŸããã åé¡ã¯ãSQL æšæºã«åŸã£ãŠããŒãžããŒã·ã§ã³ãå®çŸ©ããããšã«ãããŸãã ã©ã®ããŒãžããã§ããããããã¹ãããããã¬ã³ãŒãã®æ°ã DBMS ã«æ瀺ããŸãã æ å ±ãå°ãªããããããããŒã¿ããŒã¹ã¯ãã®ãããªãªã¯ãšã¹ããæé©åããããšãã§ããŸããã
ããã¯ç¹å®ã®ããŒã¯ãŒãã®åé¡ã§ã¯ãªããã¯ãšãªã®ã»ãã³ãã£ã¯ã¹ã®åé¡ã§ããããšãæ確ã«ããããšãéèŠã§ãã åé¡ã®ããæ§è³ªã«ãããŠåäžã®æ§æãããã«ããã€ããããŸãã
- offset ããŒã¯ãŒãã«ã€ããŠã¯åè¿°ãããšããã§ãã
- XNUMX ã€ã®ããŒã¯ãŒã limit [offset] ã®æ§é (limit èªäœã¯ããã»ã©æªããããŸããã)ã
- è¡çªå·ä»ã (ããšãã°ãrow_number()ãrownum ãªã©) ã«åºã¥ããäžéã«ãããã£ã«ã¿ãŒåŠçã
ãããã®åŒã¯ãã¹ãŠãã¹ãããããè¡æ°ã瀺ãã ãã§ãããè¿œå ã®æ å ±ãã³ã³ããã¹ãã¯ãããŸããã
ãã®èšäºã®åŸåã§ã¯ãããããã¹ãŠã®ãªãã·ã§ã³ã®æŠèŠãšã㊠offset ããŒã¯ãŒãã䜿çšãããŸãã
OFFSETãªãã®ç掻
ããŠãããããã¹ãŠã®åé¡ããªããã°ãç§ãã¡ã®äžçãã©ã®ãããªãã®ã«ãªãããæ³åããŠã¿ãŸãããã ãªãã»ãããªãã®ç掻ã¯ããã»ã©é£ãããªãããšãããããŸãããselect ã䜿çšãããšãwhere ã®æ¡ä»¶ã䜿çšããŠããŸã èŠãŠããªãè¡ (泚: ã€ãŸããåã®ããŒãžã«ãªãã£ãè¡) ã®ã¿ãéžæã§ããŸãã
ãã®å Žåãéžæãé åºä»ãã»ãã (å€ãè¯ã order by) ã§å®è¡ããããšããäºå®ããéå§ããŸãã é åºä»ãã»ããããããããéåžžã«åçŽãªãã£ã«ã¿ãŒã䜿çšããŠãåã®ããŒãžã®æåŸã®ã¬ã³ãŒãã®èåŸã«ããããŒã¿ã®ã¿ãååŸã§ããŸãã
SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY
ããããã®ã¢ãããŒãã®ååå
šäœã§ãã ãã¡ãããå€ãã®åã§äžŠã¹æ¿ãããšããã«æ¥œãããªããŸãããèãæ¹ã¯åãã§ãã ãã®èšèšã¯å€ãã®çšéã«é©çšã§ããããšã«æ³šæããããšãéèŠã§ãã
ãã®ã¢ãããŒãã¯ãã·ãŒã¯ ã¡ãœãããŸãã¯ããŒã»ãã ããŒãžããŒã·ã§ã³ãšåŒã°ããŸãã ããã¯ãããŒãã£ã³ã°çµæã®åé¡ (泚: åè¿°ã®ããŒãžèªã¿åãéã®æžã蟌ã¿ç¶æ³) ã解決ãããã¡ããã誰ããæ°ã«å
¥ã£ãŠããããšã§ãããåŸæ¥ã®ãªãã»ãããããé«éãã€å®å®ããŠåäœããŸãã å®å®æ§ã¯ããªã¯ãšã¹ãã®åŠçæéããªã¯ãšã¹ããããããŒãã«ã®æ°ã«æ¯äŸããŠå¢å ããªããšããäºå®ã«ãããŸã (泚: ããŒãžããŒã·ã§ã³ã®ããŸããŸãªã¢ãããŒãã®äœæ¥ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã
ã¹ã©ã€ãã® XNUMX ã€
éå ·ã«ã€ããŠã¯ã©ãã§ããïŒ
ããŒäžã®ããŒãžããŒã·ã§ã³ã¯ããã®æ¹æ³ã«å¯ŸããããŒã«ã®ãµããŒããäžè¶³ããŠãããããå€ãã®å Žåé©åã§ã¯ãããŸããã ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ãå«ãã»ãšãã©ã®éçºããŒã«ã§ã¯ãããŒãžããŒã·ã§ã³ã®å®è¡æ¹æ³ãæ£ç¢ºã«éžæããããšã¯ã§ããŸããã
説æãããŠããæ¹æ³ã§ã¯ãDBMS ãããã©ãŠã¶ã§ã®ç¡éã¹ã¯ããŒã«ã䌎ã AJAX ãªã¯ãšã¹ãã®å®è¡ãŸã§ã䜿çšããããã¯ãããžã®ãšã³ãããŒãšã³ãã®ãµããŒããå¿ èŠã§ãããšããäºå®ã«ãã£ãŠãç¶æ³ã¯ããã«æªåããŸãã ããŒãžçªå·ã ããæå®ãã代ããã«ããã¹ãŠã®ããŒãžã®ããŒã®ã»ãããäžåºŠã«æå®ããå¿ èŠããããŸãã
ãã ããããŒã®ããŒãžããŒã·ã§ã³ããµããŒããããã¬ãŒã ã¯ãŒã¯ã®æ°ã¯åŸã ã«å¢ããŠããŸãã çŸæç¹ã§ã®å 容ã¯æ¬¡ã®ãšããã§ãã
ãžã§ãŒã¯ Javaã®å Žåã泚æã¯ãšãª ã«ããŒã®å Žåããã£ã³ã±ãŒã¿ãŒ ОDjango ç¡éã¹ã¯ããŒã«ã®ããŒãžããŒã·ã§ã³ ãžã£ã³ãŽã®å ŽåãSQL Alchemy sqlakeyset Pythonã®å Žå;ãã¬ã€ãºæç¶æ§ â JPAå®è£ çšã®åºæºAPIãDBIx::ã¯ã©ã¹::ã©ãã㌠Perlã®å Žå;Massive.js ãNode.js ã®ããããŒããŒã»ããã®ããã¥ã¡ã³ã .
(泚: 翻蚳æã«äžéšã®ã©ã€ãã©ãªã 2017 幎ãã 2018 幎以éæŽæ°ãããŠããªãã£ããããäžéšã®ãªã³ã¯ãåé€ãããŸãããèå³ãããå Žåã¯ãå ã®ãœãŒã¹ãåç §ããŠãã ããã)
ä»ãã®ç¬éã«ããªãã®å©ããå¿
èŠã§ãã ããŒãžããŒã·ã§ã³ã䜿çšãããã¬ãŒã ã¯ãŒã¯ãéçºãŸãã¯ãµããŒãããŠããå Žåã¯ãããŒã®ããŒãžããŒã·ã§ã³ã®ãã€ãã£ã ãµããŒããæäŸãããããé¡ãããŸãã ã質åãããå ŽåããµããŒããå¿
èŠãªå Žåã¯ãåãã§ãæäŒããããŠããã ããŸã (
ããŒã«ããããŒãžããŒã·ã§ã³ããµããŒããã䟡å€ããããšæãããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããå Žåã¯ããªã¯ãšã¹ããäœæããããå¯èœã§ããã°æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŠãã ããã ãã®èšäºãžã®ãªã³ã¯ãå¯èœã§ãã
ãŸãšã
ããŒã«ããããŒãžããŒã·ã§ã³ã®ãããªåçŽã§äŸ¿å©ãªã¢ãããŒããæ®åããŠããªãçç±ã¯ãå®è£ ãæè¡çã«é£ããããã§ããå€å€§ãªåŽåãå¿ èŠãšããããã§ããããŸããã äž»ãªçç±ã¯ãå€ãã®äººããªãã»ãããèŠãŠäœæ¥ããããšã«æ £ããŠããããã§ãããã®ã¢ãããŒãã¯æšæºèªäœã«ãã£ãŠèŠå®ãããŠããŸãã
ãã®çµæãããŒãžããŒã·ã§ã³ãžã®ã¢ãããŒããå€æŽããããšèãã人ã¯ã»ãšãã©ãããããã®ããããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªããã®æ段ã«ãããµããŒãã¯ååã«çºå±ããŠããŸããã ãããã£ãŠããªãã»ãããªãã®ããŒãžããŒã·ã§ã³ã®ã¢ã€ãã¢ãšç®æšãè¿ãå Žåã¯ããããåºããã®ã«ãååãã ããã
åºæïŒ
èè
: ããŒã«ã¹ã»ãŠã£ãã³ã
åºæïŒ habr.com