PostgreSQL ã®ã©ãã§ãæ€çŽ¢ïŒãã«ããã¹ãããã©ã€ã°ã©ã ãéšåã€ã³ããã¯ã¹
å éšç»é¢åãã« Postgres ã®ãã©ãã§ãæ€çŽ¢ããèšèšããæ¹æ³ããã«ããã¹ãããã©ã€ã°ã©ã ãéšåã€ã³ããã¯ã¹ã䜿ãåããŠé«éãªçµæãå®çŸããæé ãšèãæ¹ã解説ããŸãã

å éšããŒã«ã§ãã©ãã§ãæ€çŽ¢ããæ¬åœã«æå³ããããš
瀟å ã®ç»é¢ã§ãã©ãã§ãæ€çŽ¢ããšèšããšãå€ãã®å Žåã¯ãå®å šã«äžèŽãããªããŠããèªåãæãæããŠããã¬ã³ãŒããçŽ æ©ãèŠã€ãããããšããæå³ã§ãããŠãŒã¶ãŒã¯é²èЧããŠããããã§ã¯ãªãã1 人ã®é¡§å®¢ããã±ãããè«æ±æžãããã€ã¹ã«ãããã©ãçãããã®ã§ãã
ãã®ããé ãæ€çŽ¢ã¯é ãããŒãžä»¥äžã«ã¹ãã¬ã¹ã«ãªããŸããããŒãžã®èªã¿èŸŒã¿ã¯äžåºŠã§æžãããšãå€ãã§ãããæ€çŽ¢ã¯ç¶ããŠäœåºŠãè¡ãããŸããçµæã2ã3ç§ããããšãŠãŒã¶ãŒã¯ã¯ãšãªãå€ããããããã¯ã¹ããŒã¹ã§ããçŽãããããŠãè² è·ãšãã©ã¹ãã¬ãŒã·ã§ã³ãå¢ããŸãã
1 ã€ã®æ€çŽ¢ããã¯ã¹ããã¯æ¬¡ã®ãããªæ¯ãèãã®æãæåŸ ãããŸãïŒéšåäžèŽïŒ"alex" ã§ "Alexander" ãèŠã€ããïŒãå°ããªã¿ã€ããã¹ãžã®å¯å®¹æ§ïŒ"microsfot" ã§ "Microsoft" ãèŠã€ããïŒã劥åœãªãæè¯ã®çµæãé ïŒID ãã¡ãŒã«ãäžã«æ¥ãïŒãæè¿ã®ãã®ã®ãã€ã¢ã¹ããããŠããã©ã«ãã§é©çšããããã£ã«ã¿ïŒãªãŒãã³ãã±ãããã¢ã¯ãã£ããªé¡§å®¢ãªã©ïŒã§ãã
åé¡ã¯äžã€ã®å ¥åãè€æ°ã®æå³ãé ããŠããããšã§ããæ åœè ã¯ãã±ããçªå·ã貌ãä»ãããããããŸããããååã®æçãå ¥åãããããããŸããããã¡ãŒã«ãé»è©±çªå·ãå ¥ããããšããããŸããåæå³ã¯ç°ãªãæŠç¥ãã€ã³ããã¯ã¹ãå Žåã«ãã£ãŠã¯ç°ãªãã©ã³ãã³ã°ã«ãŒã«ãèŠæ±ããŸãã
ã ããæåã«ã€ã³ããã¯ã¹ããå§ããªãã§ãã ããããŸããŠãŒã¶ãŒãå®éã«æã€æ€çŽ¢ã®æå³ãåæããID ãã¡ãŒã«ã®ãããªèå¥ãã£ãŒã«ãããããŸãæ€çŽ¢ãå¿ èŠãªååãä»¶åãé·æã®ããŒããšåããŠãã ããã
ããŒã¿ãšæ€çŽ¢ã®æ¯ãèãã«ååãä»ããŠå§ãã
ã€ã³ããã¯ã¹ãéžã¶åã«ã人ã ãå®éã«äœãã¿ã€ãããããæžãåºããŠãã ããããPostgreSQL ã©ãã§ãæ€çŽ¢ãã¯äžã€ã®æ©èœã«èãããŸãããå®éã«ã¯éåžžã«ç°ãªãæ€çŽ¢ã®æ··åã§ãã
å éšããŒã«ã§ã¯ãå³å¯ãªãèå¥åïŒæ³šæ IDããã±ããçªå·ãè«æ±æžã³ãŒãïŒãšãããããããã¹ãïŒé¡§å®¢åãã¡ãŒã«ãããŒããã¿ã°ïŒãæ··ãããŸããããã㯠PostgreSQL ã®æåãç°ãªãã®ã§åãæ±ãããããšé ãã¯ãšãªã«çŽçµããŸãã
æ¬¡ã«æ¯ãèããåããŸãïŒ
- å³å¯æ€çŽ¢ïŒ
TCK-104883ã®ãããªå€ãæ€çŽ¢ãããšãã¯äžã€ã®æ£ç¢ºãªçµæãæåŸ ãã - ãããŸãæ€çŽ¢ïŒ
john smthã®ãããªå ¥åã¯ååïŒå Žåã«ãã£ãŠã¯ã¡ãŒã«ãïŒã«ç·©ããã«äžèŽããŠçãåè£ãªã¹ããè¿ãããšãæã - ãã£ã«ã¿äž»äœã®æ€çŽ¢ïŒ
Status = OpenãšAssigned to = Meãéžã¶æäœã¯äž»ã«ãã£ã«ã¿ã§ãããã¹ãæ¬ã¯äºæ¬¡ç
çµæãã©ã³ã¯ä»ãããå¿ èŠãããããåã«ãã£ã«ã¿ããã°ããããæ©ãã«æ±ºããŠãã ãããããŒããé·ãã®èª¬æã«ã¯ã©ã³ãã³ã°ãéèŠã§ããID ãã¡ãŒã«ã§ã¯ã©ã³ãã³ã°ã¯ã©ã³ãã ã«æããããã³ã¹ãã ãäžããããšãå€ãã§ãã
çããã§ãã¯ãªã¹ãã圹ã«ç«ã¡ãŸãïŒ
- æ¯æ¥æ€çŽ¢ãããã®ã¯ã©ã®ãã£ãŒã«ããïŒ
- å ¥åã¯å³å¯ïŒIDãã³ãŒãïŒããããŸãïŒååïŒãé·æïŒããŒãïŒã©ããïŒ
- ã©ã®ãã£ã«ã¿ãã»ãšãã©æ¯åé©çšããããïŒ
- ãæè¯ã®äžèŽãé ãå¿ èŠãããããšãäžèŽããã°ååãïŒ
- ããŒãã«ã¯ã©ã®ãããæé·ãããïŒæ°åãæ°åäžãæ°çŸäžïŒ
ãããã®æ±ºå®ãå ã«ããŠããã°ãåŸã®ã€ã³ããã¯ã¹éžã³ã¯æšæž¬ã§ãªããªããŸãã
ããŒã¹ã©ã€ã³ïŒå³å¯äžèŽãš ILIKE ããªãæªããããã
ãŸãç°¡åã«éãã§ããããšãæããŸããå€ãã®å éšç»é¢ã§ã¯ãIDãæ³šæçªå·ãã¡ãŒã«ãå€éšåç §ã®ãããªå³å¯äžèŽã«ã¯æ®éã® B-tree ã€ã³ããã¯ã¹ã§ååã«å³æã®çµæãåŸãããŸãã
ãããŠãŒã¶ãŒãå®å
šãªå€ã貌ãä»ãããªããã¯ãšãªãæ¬åœã«å³å¯ã«ããŠãã ãããWHERE id = ... ã WHERE email = ... ã¯éåžžéåžžã«éãã§ããã¡ãŒã«ã«ãŠããŒã¯ã€ã³ããã¯ã¹ã匵ãã®ã¯é床ãšããŒã¿å質ã®äž¡æ¹ã«å¹ããŸãã
åé¡ã«ãªãã®ã¯ãã©ãã§ãæ€çŽ¢ããéãã« ILIKE ã«å€ãããšãã§ããname ILIKE '%ann%' ã®ãããªå
é ã¯ã€ã«ãã«ãŒãã®ããã¯ãšãªã¯ B-tree ã䜿ãããå€ãã®è¡ããã§ãã¯ããããšã«ãªããããŒãã«ã倧ãããªãã«ã€ããŠé
ããªããŸãã
ãã¬ãã£ãã¯ã¹æ€çŽ¢ã¯äœ¿ããŸããããã¿ãŒã³ãå
é ã«åºå®ãããŠããå¿
èŠããããŸãïŒname ILIKE 'ann%'ã詳现ïŒç
§åé åºã倧æåå°æåã®æ±ããã¯ãšãªãšåãåŒã§ã€ã³ããã¯ã¹ãäœã£ãŠãããïŒãéèŠã§ããUI ã倧æåå°æåãç¡èŠããå¿
èŠããããªãããã䜿ãããææ³ã¯ lower(name) ãã¯ãšãªã«ããŠãåãåŒã®ã€ã³ããã¯ã¹ãäœãããšã§ãã
ãã¹ããããŒãã®ç®å®ãåãããŠãããšåœ¹ç«ã¡ãŸãïŒ
- ãŠã©ãŒã ãã£ãã·ã¥ã§ããŒã¿ããŒã¹åŠçã¯çŽ200ms 以äž
- ãããã¯ãŒã¯ãšã¬ã³ããªã³ã°ãå«ã㊠1 ç§æªæº
- ãã䜿ãããæ€çŽ¢ã¯ç®ã«èŠããèªã¿èŸŒã¿ç¶æ ãåºããªã
ããããç®æšãããã°ãå³å¯ã»ãã¬ãã£ãã¯ã¹ã§è¡ããããã«ããã¹ãããã©ã€ã°ã©ã ã«é²ãã倿ãããããªããŸãã
ãã«ããã¹ãæ€çŽ¢ãé©åãªæ
人ãèªç¶èšèªãã¿ã€ãããŠãé¢é£ããé ç®ãèŠã€ããŠã»ãããå Žåããã«ããã¹ãæ€çŽ¢ãæé©ã§ãããã±ããã¡ãã»ãŒãžãå éšããŒããé·ã説æããã¬ããžèšäºãé話ãã°ãªã©ã該åœããŸãã
倧ããªå©ç¹ã¯ã©ã³ãã³ã°ã§ããé·ããªã¹ããè¿ããŠãã¹ããªçµæãåãããã®ã§ã¯ãªããé¢é£åºŠé ã«äžŠã¹ãããã®ã§ãæ°åè¡ãã¹ãã£ã³ããããšãªãçãã«ãã©ãçããŸãã
é«ã¬ãã«ã§ã¯ãã«ããã¹ãã¯3ã€ã®èŠçŽ ããããŸãïŒ
tsvectorïŒæ€çŽ¢å¯Ÿè±¡ã®ããã¹ããä¿åãããçæãããïŒtsqueryïŒãŠãŒã¶ãŒå ¥åã倿ããã¯ãšãªïŒ- èšèªèšå®ïŒåèªã®æ£èŠåæ¹æ³ïŒ
èšèªèšå®ãåäœã«åœ±é¿ããŸããPostgreSQL ã¯äžè¬çãªã¹ãããã¯ãŒãïŒ"the" ã "and" ãªã©ïŒãé€ããã¹ããã³ã°ãé©çšããã®ã§ã"pay"ã"paid"ã"payment" ããããããããšããããŸããããã¯ããŒããã¡ãã»ãŒãžã«ã¯æçã§ãããçãäžè¬åèªã§æ€çŽ¢ãããšãã«äœãè¿ããªããšé©ãããšããããŸãã
å矩èªïŒsynonymsïŒã倿ãã€ã³ãã§ããäŒç€Ÿã§åãæå³ã®å¥èªïŒäŸãã° "refund" ãš "chargeback"ïŒã䜿ããããªã圹ç«ã¡ãŸããããªã¹ãã¯çãããµããŒããéçšãå®éã«äœ¿ãèªã«åºã¥ããŠç®¡çããã®ãè¯ãã§ãã
å®çšäŸãšããŠãcan't login after resetããšããæ€çŽ¢ã¯ãã¡ãã»ãŒãžã« "cannot log in after password reset" ãšæžãããŠãããã±ãããæŸãã¹ãã§ããèšãåããç°ãªã£ãŠããŠãé¢é£æ§ã®é«ããã®ãèŠã€ããã®ããã«ããã¹ãã®åŒ·ã¿ã§ãILIKE ãæ€çŽ¢ãšã³ãžã³ã®ããã«äœ¿ãããéåžžã¯ãã¡ããéžã¶ã¹ãã§ãã
ãã©ã€ã°ã©ã ã€ã³ããã¯ã¹ãæå©ãªå Žå
ãã©ã€ã°ã©ã ã¯ãŠãŒã¶ãŒãæçãå ¥åãããã¿ã€ããã¹ãããå Žåã«åŒ·åã§ãããã«ããã¹ããå³ããããçããã£ãŒã«ãïŒäººåãäŒç€Ÿåããã±ããä»¶åãSKUãæ³šæçªå·ãååã³ãŒãïŒã«åããŠããŸãã
ãã©ã€ã°ã©ã ã¯æååã 3 æåãã€åã£ãå¡ã§ããPostgreSQL ã¯2ã€ã®æååãã©ãã ããã©ã€ã°ã©ã ãå
±æãããã§é¡äŒŒåºŠãèšç®ããŸããã ãã Jon Smth ã John Smith ã«ãACM ã ACME ã«ããããããããŸãããã¯ãšãªãåèªã®éäžã«ããå Žåã«ãèŠã€ãããŸãã
ãã¬ã³ãŒããèŠã€ãããçšéãã€ãŸãããã¥ã¡ã³ãã®è©±é¡ãæ¢ãã®ã§ã¯ãªãããã®è¡ãèŠã€ãããããšãããžã§ãã«ã¯ããã©ã€ã°ã©ã ãæéãã¹ã«ãªãããšãå€ãã§ãã
ãã«ããã¹ãããåªããç¹
ãã«ããã¹ãã¯æå³ã§ã®ã©ã³ãã³ã°ã«åªããŸãããçããã£ãŒã«ãã®éšåæååãå°ããªã¿ã€ããã¹ã«ã¯èªç¶ã«ã¯åŒ·ããããŸããããã©ã€ã°ã©ã ã¯ãã®ãããªãããŸããã®ããã«äœãããŠããŸãã
æžã蟌ã¿ã³ã¹ããåççã«ä¿ã€
ãã©ã€ã°ã©ã ã€ã³ããã¯ã¹ã¯å€§ãããªããæžãèŸŒã¿æã®ãªãŒããŒããããå¢ãã®ã§æ éã«äœ¿ã£ãŠãã ãããå®éã«äººã䜿ãåã«ã ãã€ã³ããã¯ã¹ã匵ããŸãïŒ
- ååãã¡ãŒã«ãäŒç€ŸåããŠãŒã¶ãŒå
- çãèå¥åïŒSKUãã³ãŒããåç §ïŒ
- ç°¡æœãªã¿ã€ãã«ãã£ãŒã«ãïŒå€§ããªããŒã/ã³ã¡ã³ãæ¬ã§ã¯ãªãïŒ
æ€çŽ¢ããã¯ã¹ã«äººãã¿ã€ãããæ£ç¢ºãªåãç¹å®ã§ããã°ããã©ã€ã°ã©ã ãå°ããéãä¿ãŠãŸãã
ãã䜿ããã£ã«ã¿ã®ããã®éšåã€ã³ããã¯ã¹
ãã©ãã§ãæ€çŽ¢ãããã¯ã¹ã«ã¯å€ãã®å Žåé ããããã©ã«ãããããŸããäœæ¥ã¹ããŒã¹å ãã¢ã¯ãã£ããªé ç®ãå逿žã¿ãé€å€ãããšãã£ããã£ã«ã¿ãåžžã«äœ¿ããããªããå ±éã±ãŒã¹ã ããã€ã³ããã¯ã¹ããããšã§éãã§ããŸãã
éšåã€ã³ããã¯ã¹ã¯ WHERE å¥ãæã€éåžžã®ã€ã³ããã¯ã¹ã§ãPostgreSQL ã¯ãã®æ¡ä»¶ãæºããè¡ã ããä¿åããããå°ããä¿ãŠãŸããçµæãšããŠèªãŸããããŒãžæ°ãæžãããã£ãã·ã¥ãããçãäžãããŸãã
ãã䜿ãéšåã€ã³ããã¯ã¹ã®å¯Ÿè±¡ã¯ã¢ã¯ãã£ãè¡ïŒstatus = 'active'ïŒããœããããªãŒãïŒdeleted_at IS NULLïŒãããã³ãã¹ã³ãŒãã³ã°ãæè¿ã®ãŠã£ã³ããŠïŒäŸ: éå»90æ¥ïŒãªã©ã§ãã
éèŠãªã®ã¯ UI ãšæ¡ä»¶ãåãããããšã§ããç»é¢ãåžžã«å逿žã¿è¡ãé ããªããã¯ãšãªãåžžã« deleted_at IS NULL ãå«ããéšåã€ã³ããã¯ã¹ãåãæ¡ä»¶ã䜿ã£ãŠãã ãããis_deleted = false ãš deleted_at IS NULL ã®ãããªå°ããªäžäžèŽã§ããã©ã³ããŒãã€ã³ããã¯ã¹ã䜿ããªãåå ã«ãªããŸãã
éšåã€ã³ããã¯ã¹ã¯ãã«ããã¹ãããã©ã€ã°ã©ã ãšçµã¿åãããŠãæå¹ã§ããããšãã°éåé€è¡ã®ã¿ã察象ã«ããã¹ãæ€çŽ¢çšã®ã€ã³ããã¯ã¹ãäœãã°ãã€ã³ããã¯ã¹ãµã€ãºãå°ããä¿ãŠãŸãã
ãã¬ãŒããªãïŒéšåã€ã³ããã¯ã¹ã¯çšãªã¯ãšãªã«ã¯åœ¹ã«ç«ã¡ã«ããã§ããå逿žã¿ãæšªææ€çŽ¢ãããããªçšãªã¯ãšãªã§ã¯ãã©ã³ããŒã¯é ããã©ã³ãéžã¶ãããããŸãããããããå Žåã¯ç®¡çè å°çšã®çµè·¯ãçšæããããçšãªã¯ãšãªãé »ç¹ãªãå¥ã€ã³ããã¯ã¹ã远å ããŸãã
ããã¯ã¹ããã¢ãããŒãã§æ€çŽ¢ãäžå¯è§£ã«ããªã
å€ãã®ããŒã ã¯äžã€ã®æ€çŽ¢ããã¯ã¹ã§ç°ãªãæå³ãæ±ãå¿ èŠããããããææ³ãæ··ããããšã«ãªããŸããç®æšã¯åŠçã®æé ãæç¢ºã«ããŠãçµæãäºæž¬å¯èœã«æããããããã«ããããšã§ãã
ã·ã³ãã«ãªåªå
é äœãããã°ãå¥ã¯ãšãªã§å®è£
ããã CASE ããžãã¯ã§äžã€ã«ãŸãšãããã«ãããããåäœãå®å®ããŸãã
äºæž¬å¯èœãªåªå éå±€
å³å¯ â ãããŸããžã𿮵éçã«ç·©ããïŒ
- ãŸãå³å¯äžèŽïŒIDãã¡ãŒã«ããã±ããçªå·ãSKUïŒã B-tree ã§
- 次ã«ãã¬ãã£ãã¯ã¹äžèŽïŒæå³ã®ããå Žåã®ã¿ïŒ
- ç¶ããŠãã©ã€ã°ã©ã ïŒååãã¿ã€ãã«ã®ã¿ã€ããã¹ãæçïŒ
- æåŸã«ãã«ããã¹ãïŒé·ãããŒããèªç±åœ¢åŒã®å 容ïŒ
åãéå±€ãå®ããšæ€çŽ¢ããã¯ã¹ã®æå³ããŠãŒã¶ãŒã«äŒããããããªããŸããããšãã°ã12345ãã¯å³åº§ã«ãã±ãããè¿ãããrefund policyãã¯é·æãæ€çŽ¢ããããšããéããèªç¶ã«ãªããŸãã
å ã«ãã£ã«ã¿ãé©çšããŠãããã¡ãžãŒåŠç
ãã¡ãžãŒæ€çŽ¢ã¯ããŒãã«å šäœã察象ã«ãããšé«ã³ã¹ãã«ãªããŸãããŠãŒã¶ãŒããã䜿ããã£ã«ã¿ïŒã¹ããŒã¿ã¹ãæ åœããŒã ãæ¥ä»ç¯å²ãã¢ã«ãŠã³ãïŒã§åè£ãçµã£ãŠãããã©ã€ã°ã©ã ããã«ããã¹ããå®è¡ããŠãã ãããæ°çŸäžè¡ãã¹ã³ã¢ãªã³ã°ãããããªå Žé¢ã§ã¯ãéããã©ã€ã°ã©ã ã§ããé ãæããŸãã
ãŸãéæè¡è ã«çè§£ã§ããäžæã«ãŒã«ãäœã䟡å€ããããŸãïŒ"ãŸããã±ããçªå·ãå³å¯äžèŽã次ã«é¡§å®¢åã¯ã¿ã€ããã¹èš±å®¹ã§ãæåŸã«ããŒããæ€çŽ¢ãã"ããããããã°åŸã§ããªããã®è¡ã衚瀺ãããã®ããã®è°è«ãé¿ããããŸãã
ã¹ããããã€ã¹ãããïŒã¢ãããŒããéžãã§å®å šã«å®è£ ãã
éãæ€çŽ¢ããã¯ã¹ã¯å°ããªæ±ºå®ã®ç©ã¿éãã§ãããŸã決å®ãæžãåºããšããŒã¿ããŒã¹äœæ¥ãç°¡åã«ãªããŸãã
- å®çŸ©ïŒããã¯ã¹ã ãããããã¯ã¹ïŒãã£ã«ã¿ãïŒã¹ããŒã¿ã¹ãææè ãæ¥ä»ç¯å²ïŒïŒ
- ãã£ãŒã«ãããšã®äžèŽã¿ã€ããéžã¶ïŒID/ã³ãŒãã¯å³å¯äžèŽãåå/ã¡ãŒã«ã¯ãã¬ãã£ãã¯ã¹ããã¡ãžãŒãé·æã¯èªç¶èšèªæ€çŽ¢
- é©åãªã€ã³ããã¯ã¹ã远å ããŠå®éã®ã¯ãšãªã§äœ¿ãããŠããã確èªããïŒ
EXPLAIN (ANALYZE, BUFFERS)ïŒ - æå³ã«åãã©ã³ãã³ã°ããœãŒãã远å ããïŒ"invoice 1042" ã®ãããªå Žåã¯å³å¯äžèŽãäžã«ïŒ
- å®éã®ã¯ãšãªã§ãã¹ãããïŒã¿ã€ããã¹ãçãèªå¥ïŒ"al"ïŒãé·æã®è²Œãä»ããç©ºå ¥åããã£ã«ã¿ã®ã¿ã¢ãŒã
å®å
šã«åºãã«ã¯ãäžåºŠã«äžã€ã ã倿ŽããŠããŒã«ããã¯ãç°¡åã«ããŠãããŸãã倧ããªããŒãã«ã®æ°ããã€ã³ããã¯ã¹ã¯ CREATE INDEX CONCURRENTLY ãåªå
ããæžã蟌ã¿ããããã¯ããªãããã«ããŠãã ãããå¯èœãªããã£ãŒãã£ãŒãã©ã°ã®è£ã§åºããŠé
å»¶ãæ¯èŒããŸãã
å®åçãªãã¿ãŒã³ã¯ïŒãŸãå³å¯äžèŽïŒéãæ£ç¢ºïŒã次ã«äººãééãããããã£ãŒã«ãã«ãã©ã€ã°ã©ã ãé·æã«ã¯ãã«ããã¹ãããšããçµã¿åããã§ãã
çŸå®çãªäŸïŒãµããŒã管çç»é¢ã®æ€çŽ¢ããã¯ã¹äžã€
ãµããŒã管çç»é¢ã§1ã€ã®æ€çŽ¢ããã¯ã¹ãããã顧客ããã±ãããããŒããŸã§èŠã€ããããããšãæåŸ ãããç¶æ³ãæ³åããŠãã ãããããã¯ãäžã€ã®å ¥åãå€çŸ©ãªæå³ãã®å žååé¡ã§ãã
æå³ãæç€ºããããšãæåã®æ¹åã§ããã¯ãšãªãã¡ãŒã«ãé»è©±çªå·ã«èŠããã顧客æ€çŽ¢ã«åãããã±ãã IDïŒäŸ: "TKT-10482"ïŒã«èŠããããã±ãããžçŽè¡ãããŸãããã®ä»ã¯ãã±ããä»¶åãšããŒãã«å¯Ÿããããã¹ãæ€çŽ¢ã«ãã©ãŒã«ããã¯ããŸãã
顧客æ€çŽ¢ã«ã¯ãã©ã€ã°ã©ã ãåãããšãå€ãã§ããååãäŒç€Ÿåã¯ææ§ã§äººãæçãå
¥åããã®ã§ãjon smi ã acm ã®ãããªæ€çŽ¢ãé«éã«èš±å®¹ã§ããŸãã
ãã±ããã®ããŒãã¯ãã«ããã¹ããé©ããŠããŸããããŒãã¯æç« ã§æžãããŠããããšãå€ããé¢é£åºŠã§äžã«æ¥ãã¹ãçµæãããããã§ããåãããŒã¯ãŒããå«ããã±ããã倿°ããå Žåãã©ã³ãã³ã°ãå¹ããŸãã
ãã£ã«ã¿ã¯ã»ãšãã©ã®ããŒã ãèãã以äžã«éèŠã§ãããšãŒãžã§ã³ããããªãŒãã³ãã±ãããã ãã§äœæ¥ãããªãããªãŒãã³è¡ã ãã察象ã«ããéšåã€ã³ããã¯ã¹ã远å ããŠãã ãããåæ§ã«ãã¢ã¯ãã£ããªé¡§å®¢ãçšã®éšåã€ã³ããã¯ã¹ãäœããšå ±éãã¹ãéããªããŸãã
éåžžã«çãã¯ãšãªã«ã¯ã«ãŒã«ãå¿ èŠã§ãïŒ
- 1â2 æåïŒæè¿ã®ãªãŒãã³ãã±ãããæè¿æŽæ°ããã顧客ã衚瀺
- 3 æå以äžïŒé¡§å®¢ãã£ãŒã«ãã«ãã©ã€ã°ã©ã ããã±ããããã¹ãã«ãã«ããã¹ããå®è¡
- æå³äžæïŒæ··åãªã¹ãã衚瀺ãããåã°ã«ãŒããäžéïŒäŸ: 顧客10ä»¶ããã±ãã10ä»¶ïŒã«ãã
æ€çŽ¢ãé ããããæ··ä¹±ããããããããã¹
ããªãæ€çŽ¢ãé ãïŒãã®å€ãã¯èªå·±é æã§ããç®çã¯ãã¹ãŠã«ã€ã³ããã¯ã¹ã匵ãããšã§ã¯ãªãã人ã ãå®éã«ããããšã«ã€ã³ããã¯ã¹ã匵ãããšã§ãã
ããããçœ ã¯ãå°æ¥ã®ããã«ãå€ãã®åã«ã€ã³ããã¯ã¹ã远å ããããšã§ããèªã¿åãã¯éããªããããããŸããããæ¿å ¥ãšæŽæ°ã«äœåãªäœæ¥ãçºçããŸãããã±ãããæ³šæããŠãŒã¶ãŒã®ããã«ã¬ã³ãŒããé »ç¹ã«å€ããå éšããŒã«ã§ã¯æžã蟌ã¿é床ãéèŠã§ãã
å¥ã®ãã¹ã¯ãå®éã«å¿ èŠãªã®ã¯ååãã¡ãŒã«ã®ã¿ã€ãèæ§ãªã®ã«ãã«ããã¹ãã䜿ã£ãŠããŸãããšã§ãããã«ããã¹ãã¯ææžã説æã«åŒ·ãã"Jon" ãš "John"ã"gmail.con" ãš "gmail.com" ã®ãããªåé¡ãèªåçã«ã¯è§£æ±ºããŸãããããããå Žåã¯ãã©ã€ã°ã©ã ã®æ¹ãé©åã§ãã
ãã£ã«ã¿ãèšç»ãå£ãåå ã«ãªããŸãã倧åã®æ€çŽ¢ãåºå®ãã£ã«ã¿ïŒstatus = 'open'ãorg_id = 42ïŒä»ããªããéšåã€ã³ããã¯ã¹ãæè¯ã®éžæãããããŸããããããå¿ãããšæåŸ
å€ã«å€ãã®è¡ãã¹ãã£ã³ããããšã«ãªããŸãã
ç¹°ãè¿ãçŸãããã¹ïŒ
- æžã蟌ã¿ã³ã¹ããæž¬ããã«å€æ°ã®ã€ã³ããã¯ã¹ã远å ãã
- ãã«ããã¹ãã§ã¿ã€ããã¹ã«å¯Ÿå¿ã§ãããšæåŸ ãã
- äžè¬çãªãã£ã«ã¿ãã©ã®ã€ã³ããã¯ã¹ãæå¹ã«ããããç¡èŠãã
- å°ããã¯ãªãŒã³ãªããŒã¿ã§ãããã¹ãããå®ããŒã¿ã®èªé »ãç¡èŠãã
- ãµããŒãããã€ã³ããã¯ã¹ããªãåã§ãœãŒãããŠé ããœãŒããçºçããã
äŸïŒãµããŒãç»é¢ã§ä»¶åã顧客åããã±ããçªå·ã§æ€çŽ¢ããææ°ã¢ã¯ãã£ããã£ã§ãœãŒãããå Žåããã£ã«ã¿ãããéåïŒäŸ: ãªãŒãã³ãã±ããïŒã«å¯Ÿã㊠latest_activity_at ã«ã€ã³ããã¯ã¹ããªããšãæ€çŽ¢ã€ã³ããã¯ã¹ã§åŸãé床ããœãŒãã§å¹ãé£ã³ãŸãã
ãªãªãŒã¹åã®ç°¡åãã§ãã¯ãªã¹ã
ãã©ãã§ãæ€çŽ¢ãã宿ãšåŒã¶åã«ãçŽæããæ¯ãèããå ·äœçã«æ±ºããŠãã ããã
- 人ã¯ã¬ã³ãŒãã IDïŒãã±ããçªå·ãã¡ãŒã«ïŒã§èŠã€ããããïŒ
- ã¿ã€ãã«å¯ŸãããããŸãäžèŽãæåŸ ãããïŒ
- ããŒãã説æã®ãããªé·æã§ã©ã³ãã³ã°ãæåŸ ãããïŒ
ã¢ãŒããæ··ãããªããè¡çªãããšãã«ã©ããåã€ããæ±ºããŠãã ããã
次㫠2â3 åã®æ€çŽ¢ãçœåŒãããã£ãŒã«ããç¹å®ããŸããããæ€çŽ¢ã®80%ãã¡ãŒã«ãååããã±ãã ID ã«ãããã®ãªãããŸãããããæé©åããæ®ããäºæ¬¡çã«æ±ããŸãã
äºååºè·ãã§ãã¯ã®ç°¡åãªãªã¹ãïŒ
- ãã£ãŒã«ãããšã®äž»ãªäžèŽã¢ãŒãã確èªïŒå³å¯ããã¡ãžãŒãã©ã³ãã³ã°ä»ãããã¹ãïŒ
- ãŠãŒã¶ãŒãæ¥åžžçã«äœ¿ããã£ã«ã¿ãåæãããã®çµã¿åããã«åãã€ã³ããã¯ã¹ãçšæ
- ãã¡ãžãŒæ€çŽ¢ã¯ 2â3 æå以äžãå¿ é ã«ãããªã©çãããå ¥åã®æ±ããæ±ºãã
- äžŠã¹æ¿ãæ¹ã説æå¯èœã«ããïŒææ°é ãããã¹ãã®ãã¹ããããããŸãã¯åçŽãªçµåã«ãŒã«
æåŸã«ãæ£ããã ãã§ãªãçŸå®çãªããŒã¿ãµã€ãºãšã¿ã€ãã³ã°ã§ãã¹ãããŠãã ããã1,000 è¡ã§ã¯å³æã«æããã¯ãšãªã 1,000,000 è¡ã§ã¯é ããªãããšããããŸãã
次ã®äžæïŒèšç»ãéãæ€çŽ¢ç»é¢ã«å€ãã
æ€çŽ¢ããã¯ã¹ãéãä¿ãããã®ã¯ããŒã ãã©ãæ¯ãèããã§åæããŠãããšãã§ãããã¬ãã£ãã¯ã¹ãã¿ã€ããã¹èš±å®¹ãã©ã®ãã£ãŒã«ããæ€çŽ¢ãããããã£ã«ã¿ãçµæã»ãããã©ãå€ããããå¹³æãªèšèã§æžããŠãããŸãããã
ãªã¢ã«ãªæ€çŽ¢ã®å°ããªãã¹ãã»ãããæã¡ãååž°ã¹ã€ãŒãã®ããã«æ±ã£ãŠãã ãããå ±éã®ååæ°ä»¶ãæççãªã¡ãŒã«ãã¿ã€ããã¹ãé·ãããŒãã®æç²ãçµæãŒãã®ã±ãŒã¹ãå ¥ããŠãããšããã§ãã倿ŽååŸã§ããããå®è¡ããããã©ãŒãã³ã¹ãé¢é£åºŠãéãã«å£ããŠããªãã確èªããŸãã
å éšããŒã«ã AppMaster (appmaster.io) ã§äœãå Žåãæ€çŽ¢ã«ãŒã«ãããŒã¿ã¢ãã«ãããžãã¹ããžãã¯ãšäžç·ã«å®çŸ©ãããšãèŠä»¶ãå€ãã£ãŠã UI æ¯ãèããšããŒã¿ããŒã¹éžæãããã«ãããªããŸãã
ãããã質å
ãæ£ç¢ºãªã¬ã³ãŒãããã°ããèŠã€ããããšããæ±ãæ¹ãããŠãã ããããã©ãŠãžã³ã°ã§ã¯ãããŸããããŸããŠãŒã¶ãŒã®å®éã®æå³ïŒID æ€çŽ¢ãtypo 察å¿ã®åå/ã¡ãŒã«æ€çŽ¢ãé·æããŒãã®æ€çŽ¢ïŒãšãã»ãšãã©åžžã«äœ¿ãããã©ã«ããã£ã«ã¿ãæžãåºããŸããããããããã©ã®ã¯ãšãªãåªå ããããã©ã®ã€ã³ããã¯ã¹ã«æè³ããããæ±ºãŸããŸãã
ILIKE '%term%' ã®ãããªå
é ãã¯ã€ã«ãã«ãŒãã®ãã¿ãŒã³ã¯ãéåžž B-tree ã€ã³ããã¯ã¹ã䜿ããªãããå€ãã®è¡ãã¹ãã£ã³ããŸããå°ããªããŒãã«ã§ã¯åé¡ãªãããã«èŠããŠããããŒã¿ãå¢ãããšæ¥éã«é
ããªããŸããéšåäžèŽãã¿ã€ãèæ§ãå¿
èŠãªãããã©ã€ã°ã©ã ããã«ããã¹ããæ€èšããŠãã ããã
WHERE id = $1 ã WHERE email = $1 ã®ãããªå³å¯æ¯èŒã䜿ããB-treeïŒã¡ãŒã«ãªãäžæã€ã³ããã¯ã¹ïŒã§æ¯ããŸããå®å
šäžèŽæ€çŽ¢ã¯æãå®äŸ¡ã§äºæž¬å¯èœãªæ¹æ³ã§ãããŠãŒã¶ãŒããã±ããçªå·ãã¡ãŒã«ã貌ãä»ããããŸããã®éãéãããã«ããŸãã
å
é ã«ã¢ã³ã«ãŒããããã¬ãã£ãã¯ã¹æ€çŽ¢ïŒäŸ: name ILIKE 'ann%'ïŒã䜿ããã¯ãšãªãšåãåŒã§ã€ã³ããã¯ã¹ãäœãããšãéèŠã§ãã倧æåå°æåãç¡èŠãããå Žå㯠lower(name) ãã¯ãšãªã§äœ¿ããåãåŒã«å¯Ÿããã€ã³ããã¯ã¹ãäœæãããšãã©ã³ããŒãå©çšã§ããŸããã¢ã³ã«ãŒã§ããªãå Žåããã¬ãã£ãã¯ã¹æ€çŽ¢ã¯åœ¹ã«ç«ã¡ãŸããã
ãŠãŒã¶ãŒãæçãå
¥åãããå°ããªç¶Žãééããããçããã£ãŒã«ãïŒååãä»¶åãSKUãã³ãŒãïŒã«ã¯ãã©ã€ã°ã©ã ãåããŸããæååã®äžå€®éšåã«ããããããJon Smth ãš John Smith ã®ãããªè¿äŒŒäžèŽãèŠã€ããããŸãããã©ã€ã°ã©ã ã¯å€§ãããªããããæžã蟌ã¿ã³ã¹ããå¢ãã®ã§ãå®éã«æ€çŽ¢ãããåã ãã«éå®ããŠäœ¿ã£ãŠãã ããã
é·æãèªç¶èšèªã§ã®æ€çŽ¢ïŒããŒããã¡ãã»ãŒãžã説æããã¬ããžããŒã¹ïŒã«ã¯ãã«ããã¹ãæ€çŽ¢ãé©ããŸãã倧ããªå©ç¹ã¯é¢é£åºŠã§ãœãŒãã§ããããšã§ããã¹ããã³ã°ãã¹ãããã¯ãŒãã®æ±ããæåã«åœ±é¿ãããããçãäžè¬åèªã§ã¯æåŸ ãšéãçµæã«ãªãããšããããŸãã
ã»ãšãã©ã®æ€çŽ¢ãå
±éã®ãã£ã«ã¿ïŒdeleted_at IS NULLãstatus = 'open'ãããã³ãå¶çŽãªã©ïŒãå«ããªããæ¡ä»¶ä»ãã®éšåã€ã³ããã¯ã¹ãäœããšã€ã³ããã¯ã¹ãå°ããä¿ããå®è¡ãéããªããŸããã¯ãšãªãéšåã€ã³ããã¯ã¹ãšãŸã£ããåãæ¡ä»¶ãå«ãã§ããå¿
èŠãããç¹ã«æ³šæããŠãã ãããå°ããªäžæŽåã§ãã©ã³ããŒãã€ã³ããã¯ã¹ãç¡èŠããããšããããŸãã
å®å®ããåªå é äœã決ããŠããã°ãŠãŒã¶ãŒã«ãšã£ãŠçµæãäºæž¬ãããããªããŸããäŸãšããŠã¯ãID/ã¡ãŒã«ã®å³å¯äžèŽâãã¬ãã£ãã¯ã¹âååãã¿ã€ãã«ã®ãã©ã€ã°ã©ã âé·æã®ãã«ããã¹ãããšããéå±€ã§ãããŸããã£ã«ã¿ã§åè£ãçµã£ãŠãããã¡ãžãŒæ€çŽ¢ãããããšãæ§èœãšé¢é£åºŠã®äž¡ç«ããããããªããŸãã
3 æå以äžãæ¡ä»¶ã«ããŠãã¡ãžãŒæ€çŽ¢ãèµ·åãããªã©ã®åçŽãªã«ãŒã«ãèšãã1â2 æåã®å ¥åã§ã¯æè¿ã®ã¬ã³ãŒãããã䜿ããã®ã衚瀺ãããªã©ã«ããŸããéåžžã«çãå ¥åã¯ãã€ãºãå€ããäœäŸ¡å€ãªé«ã³ã¹ãæ€çŽ¢ãåŒãèµ·ãããã¡ã§ããç©ºå ¥åæã®æåãæ±ºããŠãããŸãããã
ã€ã³ããã¯ã¹ãäœã£ããçŸå®çãªããŒã¿éã§ EXPLAIN (ANALYZE, BUFFERS) ã䜿ã£ãŠæ¬åœã«äœ¿ãããŠããã確èªããŸãã倿Žã¯äžåºŠã«äžã€ãã€åºããããŒã«ããã¯ãç°¡åã«ããŠãããŸãã倧ããªããŒãã«ã§ã¯ CREATE INDEX CONCURRENTLY ã䜿ã£ãŠæžã蟌ã¿ããããã¯ããªãããã«ããŠãã ãããAppMaster (appmaster.io) ã䜿ãå Žåã¯ãæ€çŽ¢ã«ãŒã«ãããŒã¿ã¢ãã«ãšäžç·ã«å®çŸ©ã㊠UI ãš DB ã®äžæŽåãé²ããšè¯ãã§ãããã


