ð DBããã©ãŒãã³ã¹ã®æ¥µæïŒã€ã³ããã¯ã¹æé©åãšã¯ãšãªãã¥ãŒãã³ã°å®å šæ»ç¥
ã¯ããã«
ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã¯ãã·ã¹ãã å šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ãã¹ã±ãŒã©ããªãã£ã«çŽçµããŸããç¹ã«å€§éã®ããŒã¿ãæ±ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãé©åãªDBãã¥ãŒãã³ã°ãšã€ã³ããã¯ã¹ã®æé©åãäžå¯æ¬ ã§ããæ¬èšäºã§ã¯ãå®éã®éçšçµéšã«åºã¥ããããã©ãŒãã³ã¹æ¹åã®ããã®ãã¹ããã©ã¯ãã£ã¹ãæ·±æãããŸãã
ð 1. ã€ã³ããã¯ã¹ã®æ¬è³ªãçè§£ãã
ã€ã³ããã¯ã¹ã¯ã¯ãšãªã®å®è¡é床ãåçã«åäžãããŸãããé©çšã®ä»æ¹ã«ãã£ãŠã¯é广ã«ãªãããšããããŸãããŸããåºæ¬çãªã€ã³ããã¯ã¹ã®çš®é¡ãæŽçããŸãããã
ð äž»ãªã€ã³ããã¯ã¹ã®çš®é¡
- B-Treeã€ã³ããã¯ã¹: äžè¬çãªã€ã³ããã¯ã¹åœ¢åŒãç¯å²æ€çŽ¢ããœãŒãã«åŒ·ãã
- Hashã€ã³ããã¯ã¹: å®å šäžèŽæ€çŽ¢ã«æé©ã ããç¯å²æ€çŽ¢ã«ã¯äžåãã
- Full-Textã€ã³ããã¯ã¹: ããã¹ãæ€çŽ¢åãã§ãèªç¶èšèªæ€çŽ¢ãå¯èœã
- GIN / GiST ã€ã³ããã¯ã¹: JSONBãå šææ€çŽ¢ãªã©ãç¹æ®ãªããŒã¿åã«æé©ã
ð ã€ã³ããã¯ã¹æé©åã®ãã€ã³ã
â
éžææ§ïŒSelectivityïŒãæèãã: ã«ãŒãã£ããªãã£ã®äœãã«ã©ã ã«ã€ã³ããã¯ã¹ã匵ããšå¹æãäœããäŸãã°ãæ§å¥ïŒç·å¥³ïŒãã®ãããªã«ã©ã ã«ã€ã³ããã¯ã¹ã匵ãã®ã¯éå¹çã
â
ã«ããªã³ã°ã€ã³ããã¯ã¹ã掻çš: SELECT
å¥ã§å¿
èŠãªã«ã©ã ãã€ã³ããã¯ã¹å
ã«åããããšã§ãããŒãã«ã¢ã¯ã»ã¹ãåé¿ã
â
è€åã€ã³ããã¯ã¹ã®é åºãæé©å: WHERE
å¥ã ORDER BY
ã®é åºã«åºã¥ããŠã€ã³ããã¯ã¹ã®é çªã決ããã
ð 2. ã¯ãšãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ãã
ããã©ãŒãã³ã¹æ¹åã®ç¬¬äžæ©ã¯ãé ãã¯ãšãªã®ç¹å®ã§ãã以äžã®ææ³ã掻çšããŸãããã
ð ã¯ãšãªã®ããã«ããã¯ãèŠã€ããæ¹æ³
-
EXPLAIN (ANALYZE) ãæŽ»çš
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
Seq Scan
ïŒã·ãŒã±ã³ã·ã£ã«ã¹ãã£ã³ïŒãçºçããŠããå Žåãã€ã³ããã¯ã¹ã远å ãã¹ãã -
pg_stat_statementsïŒPostgreSQLïŒã䜿ã
SELECT query, calls, total_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;
æãå®è¡æéãé·ãã¯ãšãªãç¹å®ã§ããã
-
ã¯ãšãªãã£ãã·ã¥ã®å©çš
ããŒã¿ããŒã¹ã«ãã£ãŠã¯ã¯ãšãªãã£ãã·ã¥ãæå¹ãªå ŽåãããïŒMySQLã®Query Cache
ãªã©ïŒããã ãããã£ãã·ã¥ç¡å¹åã®åœ±é¿ãèæ ®ããã
ð¯ 3. ããã©ãŒãã³ã¹ãæå€§åããã¯ãšãªèšèš
ð 1. äžèŠãª SELECT *
ãé¿ãã
-
SELECT *
ã¯ã«ã©ã æ°ãå€ãããŒãã«ã§ç¹ã«éå¹çã - å¿ èŠãªã«ã©ã ã®ã¿æå®ããããšã§I/Oè² è·ã軜æžã
ð 2. é©åãªJOINæŠç¥ãéžæãã
-
INNER JOIN
ãæãé«éã§ããããããŒã¿ã®æ§è³ªã«ãã£ãŠLEFT JOIN
ãªã©ãé©çšå¯èœã -
EXPLAIN
ãçšããŠHash Join
ãNested Loop
ã®æç¡ã確èªã
ð 3. ãããåŠçã®æŽ»çš
- äžåºŠã«å€§éã®
INSERT
/UPDATE
ãè¡ãã®ã§ã¯ãªããé©åãªããããµã€ãºã§åŠçã - äŸ: 10,000 ã¬ã³ãŒãã 1,000 ä»¶ãã€åå²ããŠåŠçã
ð 4. ããŒã¿ããŒã¹ã®ãã©ã¡ãŒã¿ãã¥ãŒãã³ã°
DBã®èšå®ãããã©ãŒãã³ã¹ã«åœ±é¿ããŸãã以äžã®ãã©ã¡ãŒã¿ã調æŽããããšã§ãã¯ãšãªã®å¿çé床ãåäžãããããšãã§ããŸãã
ð 1. work_mem
ïŒPostgreSQLïŒãå¢ãã
- ãœãŒããããã·ã¥çµåã«äœ¿ãããã¡ã¢ãªãµã€ãºã
- ããã©ã«ãå€ã§ã¯äžè¶³ããã¡ãªã®ã§ãã¯ãšãªã®ã¡ã¢ãªäœ¿çšéã確èªããªããå¢å ã
ð 2. innodb_buffer_pool_size
ïŒMySQLïŒãæé©å
- InnoDB ã®ãã£ãã·ã¥é åãå¢ããããšã§ããã£ã¹ã¯I/Oãåæžã
- ããŒã¿ããŒã¹ãµã€ãºã®çŽ70ã80%ãå²ãåœãŠãã®ãäžè¬çã
ð 3. ã³ãã¯ã·ã§ã³ããŒã«ã®é©åãªèšå®
- ã¢ããªã±ãŒã·ã§ã³åŽã§éå°ãªDBæ¥ç¶ãé²ãããã
pgbouncer
ïŒPostgreSQLïŒãHikariCP
ïŒJDBCïŒã掻çšã
â ãŸãšãïŒããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®å®è·µãããŒ
1ïžâ£ ããã«ããã¯ã®ç¹å®: EXPLAIN ANALYZE
ã pg_stat_statements
ãæŽ»çšã
2ïžâ£ é©åãªã€ã³ããã¯ã¹èšèš: é«ã«ãŒãã£ããªãã£ãªã«ã©ã ãäžå¿ã«æé©åã
3ïžâ£ ã¯ãšãªã®æé©å: SELECT *
ã®åé¿ãé©åãªJOINæŠç¥ããããåŠçã®æŽ»çšã
4ïžâ£ DBèšå®ã®ãã¥ãŒãã³ã°: work_mem
ã buffer_pool_size
ã®é©åãªèª¿æŽã
ããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹æé©åã¯ãã·ã¹ãã å šäœã®ã¬ã¹ãã³ã¹åäžã«çŽçµããŸããé©åãªåæãšãã¥ãŒãã³ã°ãè¡ããå¹ççãªDBéçšãç®æããŸãããïŒð
ð ãã®èšäºã圹ã«ç«ã£ããããããïŒã·ã§ã¢ããé¡ãããŸãïŒ