æçµæŽæ°:
ãä»çµã¿è§£èª¬ãããŒã¿ããŒã¹ã®ã€ã³ããã¯ã¹ã¯ãªãéãïŒ â B-Treeã®ä»çµã¿ãå³è§£
ããŒã¿ããŒã¹ãé
ãã£ãŠè©±ãããèããã©ãã€ã³ããã¯ã¹ã貌ããšéããªãã£ãŠæ¬åœïŒ
æ¬åœã ãããŸããã€ã³ããã¯ã¹ããªãç¶æ
ããæ³åããŠã¿ããã100äžè¡ã®ããŒãã«ãã1ä»¶æ¢ããšããDBã¯å
é ãã1è¡ãã€å
šéšãã§ãã¯ããŠããããããããã«ããŒãã«ã¹ãã£ã³ããšãããã ãæ¬ã§èšãã°ãç®æ¬¡ã玢åŒããªãã«1ããŒãžç®ããå
šããŒãžããã£ãŠæ¢ããããªãã®ã ãã
ããã¯ç¢ºãã«é
ããâŠãã€ã³ããã¯ã¹ããããšã©ãå€ããã®ïŒ
ã€ã³ããã¯ã¹ã¯ããŸãã«ãæ¬ã®çŽ¢åŒïŒããããïŒããšåãä»çµã¿ã ãã玢åŒã«ã¯ãããŒã¯ãŒã â ããŒãžçªå·ãã䞊ãã§ãããããDBã®ã€ã³ããã¯ã¹ããã«ã©ã ã®å€ â è¡ã®å ŽæããæŽçããŠä¿æããŠãããã ãã ããå
šè¡ãèŠãªããŠãã玢åŒããã©ãã ãã§ç®çã®ããŒã¿ã«äžçºã§ãã©ãçããã
ãªãã»ã©ïŒã§ã玢åŒã£ãŠã©ãããæ§é ã§æŽçãããŠããã®ïŒ
æãäžè¬çãªã®ããB-TreeïŒããŒããªãŒïŒããšããæšæ§é ã ããPostgreSQLããCREATE INDEXã§çš®é¡ãæå®ããªããã°B-Treeãäœããæ ¹ïŒã«ãŒãïŒããæåããããŠãã£ãŠãèïŒãªãŒãïŒã«è¡ã®åšããã瀺ãæ
å ±ããããããšãã°100äžä»¶ã®ããŒã¿ã§ããB-TreeãªãçŽ20åã®æ¯èŒã§ç®çã®è¡ã«ãã©ãçãããèšç®éã§ãããš O(log n) ã§ããã«ã¹ãã£ã³ã® O(n) ãšæ¯ã¹ããšæ¡éãã«éããã ã
èã£ã±ã«ã¯è¡ã®å ŽæãæžããŠãããã ããããŒã¿ãã®ãã®ãããªãã®ïŒ
ããã¯DBã«ãã£ãŠéããã ãMySQLã®InnoDBã ãšäž»ããŒã®ãã¯ã©ã¹ã¿ã€ã³ããã¯ã¹ãã®èã«è¡ããŒã¿ãã®ãã®ãå
¥ã£ãŠããŠã玢åŒããã©ããšãã®ãŸãŸããŒã¿ã®ããŒãžã«çããäžæ¹ã§ãã以å€ã®çŽ¢åŒïŒã»ã«ã³ããªã€ã³ããã¯ã¹ïŒã®èã«ã¯äž»ããŒã®å€ãå
¥ã£ãŠããŠãããããããäžåºŠã¯ã©ã¹ã¿ã€ã³ããã¯ã¹ãåŒãçŽããã ãããèïŒãã€ã³ã¿ããšäžžæèšããã䜿ã£ãŠããDBã®æ§é ã確èªããã®ã倧äºã ãã
O(log n) ã£ãŠããšã¯ãããŒã¿ãåã«å¢ããŠãæ¯èŒåæ°ã¯1åããå¢ããªãã£ãŠããšïŒ
ãã®éãïŒ100äžä»¶ã§çŽ20åã200äžä»¶ã§ãçŽ21åããããB-Treeã®åŒ·ãã ããã¡ãªã¿ã«æšã®åããŒãã¯è€æ°ã®ããŒãæãŠãããããã£ã¹ã¯ã®èªã¿åãåæ°ãæå°éã«æããããèšèšã«ãªã£ãŠãããã ã
è€åã€ã³ããã¯ã¹ã£ãŠããã®ãèããããšããããã©ãæ®éã®ã€ã³ããã¯ã¹ãšäœãéãã®ïŒ
è€åã€ã³ããã¯ã¹ã¯ãè€æ°ã®ã«ã©ã ããŸãšããŠ1ã€ã®ã€ã³ããã¯ã¹ã«ãããã®ã ããããšãã°ãå§ããšãåãã§è€åã€ã³ããã¯ã¹ãäœããšããå§ïŒç°äž AND åïŒå€ªéãã®æ€çŽ¢ã1ã€ã®ã€ã³ããã¯ã¹ã ãã§æžãããã ãé çªãéèŠã§ããå§, åãã®é ã§äœã£ãã€ã³ããã¯ã¹ã¯ãå§ãã ãã®æ€çŽ¢ã«ã䜿ãããã©ããåãã ãã®æ€çŽ¢ã«ã¯äœ¿ããªããé»è©±åž³ããå§ â åãã®é ã§äžŠãã§ããã®ãšåãçå±ã ãã
ã«ããªã³ã°ã€ã³ããã¯ã¹ã£ãŠããã®ãããã£ãŠèãããã©ãããã¯äœïŒ
ã«ããªã³ã°ã€ã³ããã¯ã¹ã¯ãã¯ãšãªãå¿
èŠãšããã«ã©ã ããã¹ãŠã€ã³ããã¯ã¹ã«å«ãŸããŠããç¶æ
ã®ããšã ããéåžžã¯ã€ã³ããã¯ã¹ã§è¡ã®äœçœ®ãèŠã€ããŠãããããŒãã«æ¬äœã«ããŒã¿ãåãã«è¡ããã§ãã«ããªã³ã°ã€ã³ããã¯ã¹ãªããã€ã³ããã¯ã¹ã ãã§çµæãè¿ããå¯èœæ§ããããPostgreSQLã§ã¯ããããã€ã³ããã¯ã¹ãªã³ãªãŒã¹ãã£ã³ããšåŒã¶ãã ã
ãå¯èœæ§ããããã£ãŠãå¿
ãéããªããããããªãã®ïŒ
ãããããã誀解ããããããšãããPostgreSQLã®ã€ã³ããã¯ã¹ã«ã¯ããã®è¡ãä»èŠããŠãããã©ãããã®å¯èŠæ§æ
å ±ãå
¥ã£ãŠããªããŠãããŒãã«åŽã«ãããªããã ãã ããå¯èŠæ§ãããã®ããããç«ã£ãŠããªãããŒãžã¯ãçµå±ããŒãã«ãèŠã«è¡ãããšã«ãªã£ãŠæ®éã®ã€ã³ããã¯ã¹ã¹ãã£ã³ãšå€ãããªããªããæŽæ°ãé »ç¹ãªããŒãã«ã§ã«ã©ã ãè©°ã蟌ãã§ãæåŸ
ã©ããã«ã¯å¹ããªãããšããããšã ãã
ãããå
šéšã®ã«ã©ã ã«ã€ã³ããã¯ã¹ã貌ãã°æåŒ·ã£ãŠããšïŒ
ãããèœãšã穎ãªãã ãã€ã³ããã¯ã¹ã¯ãèªã¿åããéããã代ããã«ãæžã蟌ã¿ãé
ãããããšãããã¬ãŒããªãããããINSERT ã UPDATE ã®ãã³ã«ãããŒãã«æ¬äœã ãã§ãªãã€ã³ããã¯ã¹ãæŽæ°ããªãããããªãããããã€ã³ããã¯ã¹ã10åããã°ã1åã®INSERTã§11ç®æïŒããŒãã«ïŒã€ã³ããã¯ã¹10åïŒãæŽæ°ããããšã«ãªããã¹ãã¬ãŒãžå®¹éãé£ããã貌ãããã¯é广ã ãã
ããã¿ã«è²Œã£ã¡ããã¡ãªãã ãâŠã广ãããã確èªããæ¹æ³ã£ãŠããã®ïŒ
EXPLAINã³ãã³ãã䜿ããšããããSQLã®å
é ã« EXPLAIN ãã€ãããšãDBããã®ã¯ãšãªãã©ãå®è¡ãããïŒå®è¡èšç»ïŒãæããŠãããããSeq Scanããšåºãããã«ã¹ãã£ã³ããIndex Scanããšåºããã€ã³ããã¯ã¹ã䜿ãããŠãããPostgreSQLãªã EXPLAIN ANALYZE ãã€ãããšå®éã®å®è¡æéã衚瀺ããããããã€ã³ããã¯ã¹ã®å¹æãæ°å€ã§ç¢ºèªã§ãããã ã
B-Tree以å€ã®ã€ã³ããã¯ã¹ãããã®ïŒ
ãããã代衚çãªã®ããããã·ã¥ã€ã³ããã¯ã¹ãã ããããã·ã¥é¢æ°ã§å€ã倿ããŠãçŽæ¥ããŒã¿ã®å Žæãå²ãåºãæ¹åŒã ãå®å
šäžèŽæ€çŽ¢ïŒWHERE id = 100ïŒãªã O(1) ã§ B-Tree ããéãå Žåãããããã ãç¯å²æ€çŽ¢ïŒWHERE id BETWEEN 1 AND 100ïŒã ORDER BY ã«ã¯äœ¿ããªããšãã倧ããªå¶çŽããããã ããæ±çšæ§ã®é«ã B-Tree ãããã©ã«ãã§äœ¿ãããããšãã»ãšãã©ã ãã
ã€ã³ããã¯ã¹ã®èšèšã£ãŠå¥¥ãæ·±ããã ãâŠãå®åã§ã¯ã©ã倿ããã°ããã®ïŒ
åºæ¬æ¹éã¯3ã€ããŸã WHERE å¥ã JOIN æ¡ä»¶ã«é »ç¹ã«äœ¿ãã«ã©ã ã«ã€ã³ããã¯ã¹ã貌ãããšã次ã«ãã«ãŒãã£ããªãã£ïŒå€ã®çš®é¡æ°ïŒãé«ãã«ã©ã ãåªå
ããããšãæ§å¥ã®ããã«2çš®é¡ãããªãåã¯ã€ã³ããã¯ã¹ã®æ©æµãèããæåŸã«ã宿çã« EXPLAIN ã§å®è¡èšç»ã確èªããŠãäžèŠãªã€ã³ããã¯ã¹ã¯åé€ããããšããå¿
èŠãªãã®ã ãããå¿
èŠãªé åºã§ããéåã ãã
åèè³æ
ç¢ºèªæ¥ïŒ2026幎9æ23æ¥ãæåã¯DB補åãšããŒãžã§ã³ã§ç°ãªããããå®éã®å€æã¯äœ¿çšäžã®DBã®å ¬åŒããã¥ã¡ã³ãã§ç¢ºèªããŠãã ããã
- PostgreSQL: Index Types â CREATE INDEXã®æ¢å®ã¯B-Treeãããã·ã¥ã€ã³ããã¯ã¹ã¯ç䟡æ¯èŒïŒ
=ïŒã®ã¿æ±ãã - PostgreSQL: Index-Only Scans and Covering Indexes â å¯èŠæ§æ å ±ã¯ã€ã³ããã¯ã¹ã«ãªããå¯èŠæ§ãããæ¬¡ç¬¬ã§ããŒãã«åç §ãçºçãã
- PostgreSQL: Using EXPLAIN â å®è¡èšç»ã®èªã¿æ¹ãš EXPLAIN ANALYZE
- MySQL: Clustered and Secondary Indexes â ã¯ã©ã¹ã¿ã€ã³ããã¯ã¹ã®èã«è¡ããŒã¿ãå ¥ããã»ã«ã³ããªã€ã³ããã¯ã¹ã¯äž»ããŒå€ãä¿æãã