- 1 1. ã¯ããã«
- 2 2. EXPLAINãšEXPLAIN ANALYZEã®éã
- 3 3. EXPLAIN ANALYZEã®åºå圢åŒ
- 4 4. å®è¡èšç»ã®èªã¿è§£ãæ¹
- 5 5. ã¯ãšãªæé©åã®å®è·µäŸ
- 6 6. 泚æç¹ãšãã¹ããã©ã¯ãã£ã¹
- 7 7. ãããã質åïŒFAQïŒ
- 7.1 Q1. EXPLAIN ANALYZE ã¯ã©ã®ããŒãžã§ã³ããå©çšã§ããŸããïŒ
- 7.2 Q2. EXPLAIN ANALYZE ãå®è¡ãããšãããŒã¿ã倿Žãããããšã¯ãããŸããïŒ
- 7.3 Q3. EXPLAIN ã ãã§ã¯ãã¡ãªã®ã§ããïŒ
- 7.4 Q4. åºåããããloopsãããactual timeããªã©ã®æ°å€ã¯ãã©ã®çšåºŠæ£ç¢ºã§ããïŒ
- 7.5 Q5. å®è¡çµæã®ãcostãã£ãŠå ·äœçã«äœã衚ããŠããã®ã§ããïŒ
- 7.6 Q6. JSON圢åŒãTREE圢åŒã䜿ããšãäœã䟿å©ãªã®ã§ããïŒ
- 7.7 Q7. å®è¡èšç»ãèŠãŠæ¹åã§ããªãã£ãå Žåã¯ã©ãããã°ïŒ
1. ã¯ããã«
ããŒã¿ããŒã¹ããã©ãŒãã³ã¹ã®æé©åã«äžå¯æ¬ ãªãå®è¡èšç»ã
Webã¢ããªã±ãŒã·ã§ã³ãæ¥åã·ã¹ãã ã«ãããŠãããŒã¿ããŒã¹ã®ããã©ãŒãã³ã¹ã¯å
šäœã®ã¬ã¹ãã³ã¹ã«çŽçµããéèŠãªèŠçŽ ã§ããç¹ã«MySQLã䜿çšããŠããå Žåãã¯ãšãªã®å¹çæ§ã枬ãããã«ãå®è¡èšç»ïŒExecution PlanïŒããææ¡ããããšãäžå¯æ¬ ã§ããåŸæ¥ããå©çšãããŠãã EXPLAIN
ã³ãã³ãã¯ãSQLæã®å®è¡åã«ãã®èšç»ã衚瀺ããéçºè
ã«ãšã£ãŠéèŠãªæããããæäŸããŠããŸããã
MySQL 8.0ã§å°å ¥ããããEXPLAIN ANALYZEã
MySQL 8.0.18ããæ°ãã«ç»å Žãã EXPLAIN ANALYZE
ã¯ãåŸæ¥ã® EXPLAIN
ãäžæ©é²åããã匷åãªããŒã«ã§ãããããŸã§ã® EXPLAIN
ããçè«çãªèšç»ãã«ãšã©ãŸã£ãŠããã®ã«å¯ŸããEXPLAIN ANALYZE
ã¯å®éã«ã¯ãšãªãå®è¡ããå®è¡æéãè¡æ°ãªã©ã®ã宿ž¬ããŒã¿ããæäŸããŸããããã«ãããããæ£ç¢ºãªããã«ããã¯ã®ç¹å®ããã¯ãšãªæé©åã®å¹ææ€èšŒãå¯èœãšãªããŸãã
ãªã EXPLAIN ANALYZE
ãéèŠãªã®ã
ããšãã°ãJOINã®é åºãã€ã³ããã¯ã¹ã®æç¡ããã£ã«ã¿ãŒã®ãããå
·åãªã©ã¯ãå®è¡æéã«å€§ããªåœ±é¿ãåãŒããŸããEXPLAIN ANALYZE
ã䜿ãã°ãSQLæã®å®è¡çµæãç®èŠã§ç¢ºèªããªãããã©ã®éšåã«ç¡é§ãããããã©ããæé©åãã¹ããã倿ã§ããŸããããã¯ç¹ã«å€§èŠæš¡ããŒã¿ãè€éãªã¯ãšãªãæ±ãçŸå Žã§ã¯ãæ¬ ãããªãåæææ³ãšãããã§ãããã
æ¬èšäºã®ç®çãšæ³å®èªè
ãã®èšäºã§ã¯ãMySQLã® EXPLAIN ANALYZE
ã®åºæ¬çãªäœ¿ãæ¹ãããåºåçµæã®èªã¿è§£ãæ¹ãå®è·µçãªæé©åææ³ãŸã§ã段éçã«è§£èª¬ããŠãããŸãã察象èªè
ã¯ãMySQLãæ¥åžžçã«äœ¿çšããŠããéçºè
ãã€ã³ãã©æ
åœè
ãããã©ãŒãã³ã¹æ¹åã«èå³ãæã€ãšã³ãžãã¢ã§ããåå¿è
ã®æ¹ã«ãçè§£ããããããã«ãçšèªè§£èª¬ãå
·äœäŸã亀ããªããé²ããŠãããŸãã®ã§ãå®å¿ããŠèªã¿é²ããŠãã ããã
2. EXPLAIN
ãšEXPLAIN ANALYZE
ã®éã
EXPLAIN
ã®åœ¹å²ãšåºæ¬çãªäœ¿ãæ¹
MySQLã® EXPLAIN
ã¯ãSQLæïŒç¹ã«SELECTæïŒãã©ã®ããã«å®è¡ãããããäºåã«ç¥ãããã®åæããŒã«ã§ããã€ã³ããã¯ã¹ã®äœ¿çšæç¡ãããŒãã«ã®çµåé åºãæ€çŽ¢ç¯å²ãªã©ã®å®è¡èšç»ã確èªããããšãã§ããŸãã
ããšãã°ã以äžã®ããã«äœ¿ããŸãã
EXPLAIN SELECT * FROM users WHERE age > 30;
ãã®ãããªã³ãã³ããå®è¡ãããšãMySQLã¯ãã®ã¯ãšãªãå®è¡ããã«ãã©ã®ããã«åŠçãããäºå®ãã衚圢åŒã§è¡šç€ºããŸããåºåã«ã¯ã䜿çšãããã€ã³ããã¯ã¹ïŒkeyïŒãã¢ã¯ã»ã¹æ¹æ³ïŒtypeïŒãèŠç©ããè¡æ°ïŒrowsïŒãªã©ãå«ãŸããŸãã
EXPLAIN ANALYZE
ã®åœ¹å²ãšç¹é·
äžæ¹ã§ãMySQL 8.0.18以éã«å°å
¥ããã EXPLAIN ANALYZE
ã¯ãå®éã«ã¯ãšãªãå®è¡ããããã§ã宿ž¬å€ã«åºã¥ããå®è¡èšç»ã衚瀺ããæ°æ©èœã§ããããã«ãããåŸæ¥ã® EXPLAIN
ã§ã¯èŠããªãã£ããåŠçã«ããã£ã宿éãããå®éã«åŠçãããè¡æ°ãã確èªã§ããããã«ãªããŸããã
å®è¡äŸã¯ä»¥äžã®éãã§ãïŒ
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;
ãã®ã³ãã³ãã§ã¯ãMySQLã¯å®éã«ã¯ãšãªãå®è¡ããåºåãšããŠä»¥äžã®ãããªæ å ±ãè¿ããŸãã
- å®è¡ãã©ã³ã®åã¹ãããã«ããã£ãæéïŒe.g.
0.0022 sec
ïŒ - å®éã«èªã¿åã£ãè¡æ°ïŒ
rows
ïŒ - åŠçã®ãã¹ãæ§é ïŒTREE圢åŒã䜿ãããšã§å¯èŠåã容æïŒ
äž¡è ã®äž»ãªéãã®ãŸãšã
é ç® | EXPLAIN | EXPLAIN ANALYZE |
---|---|---|
å®è¡ã®æç¡ | å®è¡ããªã | å®éã«ã¯ãšãªãå®è¡ãã |
æäŸæ å ± | å®è¡åã®æšå®æ å ± | å®è¡åŸã®å®æž¬æ å ± |
䜿çšçšé | ã€ã³ããã¯ã¹ãçµåé åºã®ç¢ºèª | å®éã®ããã©ãŒãã³ã¹åæ |
MySQLããŒãžã§ã³ | å€ãããååš | MySQL 8.0.18以é |
ã©ã¡ãã䜿ãã¹ããïŒ
- ã¯ãšãªã®æ§é ãçŽ æ©ã確èªãããå Žåã¯
EXPLAIN
- ã¯ãšãªã®åŠçæéãå®è¡ã³ã¹ããå
·äœçã«ææ¡ãããå Žåã¯
EXPLAIN ANALYZE
ãšãã䜿ãåããåºæ¬ã«ãªããŸããç¹ã«ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®å Žé¢ã§ã¯ãEXPLAIN ANALYZE
ã«ãã£ãŠãäºæž¬ãã§ã¯ãªãã宿
ãã«åºã¥ããæé©åãå¯èœãšãªããããéåžžã«æå¹ãªããŒã«ãšãããã§ãããã
3. EXPLAIN ANALYZE
ã®åºå圢åŒ
åºå圢åŒã¯3çš®é¡ïŒTRADITIONALã»JSONã»TREE
MySQLã® EXPLAIN ANALYZE
ã¯ãçšéãç®çã«å¿ããŠç°ãªããã©ãŒãããã§çµæãåºåã§ããŸããMySQL 8.0以éã§ã¯ã以äžã®3çš®é¡ã®åºå圢åŒãçšæãããŠããŸãã
ãã©ãŒãããå | ç¹åŸŽ | 䜿ãããã |
---|---|---|
TRADITIONAL | 衚圢åŒã®åŸæ¥ã¹ã¿ã€ã«ã銎æã¿ããã | åå¿è åã |
JSON | æ§é åããã詳现æ å ±ãåŸããã | åæããŒã«é£æºåã |
TREE | ãã¹ãæ§é ãèŠèŠçã«ããã | äžçŽè 以äžåã |
ããããã®åœ¢åŒã®éãã詳ããèŠãŠãããŸãããã
TRADITIONAL圢åŒïŒããã©ã«ãïŒ
TRADITIONALã¯ãåŸæ¥ã® EXPLAIN
ãšäŒŒãã¹ã¿ã€ã«ã®åºåã§ãå®è¡èšç»ã衚圢åŒã§ç¢ºèªã§ããŸããEXPLAIN ANALYZE
ããã®ãŸãŸäœ¿ããšãåºæ¬çã«ã¯ãã®åœ¢åŒã§åºåãããŸãã
åºåäŸïŒäžéšæç²ïŒïŒ
-> Filter: (age > 30) (cost=0.35 rows=10) (actual time=0.002..0.004 rows=8 loops=1)
cost
ïŒæšå®ã³ã¹ãactual time
ïŒå®æž¬æérows
ïŒæšå®ãããåŠçè¡æ°ïŒå®è¡åïŒloops
ïŒã«ãŒãåæ°ïŒç¹ã«JOINã§éèŠïŒ
TRADITIONAL圢åŒã¯äººéããããšèŠãŠçè§£ãããããåå¿è ãç°¡æç¢ºèªã«åããŠããŸãã
JSON圢åŒ
ãã詳现ã§ããã°ã©ã ãããæ±ããããã®ãJSON圢åŒã§ããæ§é åãããŠãããåããŒãã®æ å ±ããã¹ãããããªããžã§ã¯ããšããŠåºåãããŸãã
å®è¡ã³ãã³ãïŒ
EXPLAIN ANALYZE FORMAT=JSON SELECT * FROM users WHERE age > 30;
åºåäŸã®äžéšïŒæŽåœ¢æžïŒïŒ
{
"query_block": {
"table": {
"table_name": "users",
"access_type": "range",
"rows_examined_per_scan": 100,
"actual_rows": 80,
"filtered": 100,
"cost_info": {
"query_cost": "0.35"
},
"timing": {
"start_time": 0.001,
"end_time": 0.004
}
}
}
}
ãã®åœ¢åŒã¯èŠèŠçã«ã¯èªã¿ã«ããã§ãããããŒã¿ãããŒã¹ããŠããŒã«ãããã·ã¥ããŒãã«åã蟌ãéã«ã¯éåžžã«äŸ¿å©ã§ãã
TREE圢åŒïŒèªã¿ããããšæ§é ã®å¯èŠåïŒ
TREE圢åŒã¯ãã¯ãšãªã®åŠçæ§é ãæšæ§é ã§è¡šç€ºãã圢åŒã§ãJOINããµãã¯ãšãªã®åŠçé åºãèŠèŠçã«ææ¡ã§ããŸãã
å®è¡ã³ãã³ãïŒ
EXPLAIN ANALYZE FORMAT=TREE SELECT * FROM users WHERE age > 30;
åºåäŸïŒç°¡ç¥åïŒïŒ
-> Table scan on users (actual time=0.002..0.004 rows=8 loops=1)
è€éãªã¯ãšãªã§ã¯ã以äžã®ããã«ãã¹ãã衚瀺ãããŸãïŒ
-> Nested loop join
-> Table scan on users
-> Index lookup on orders using idx_user_id
TREE圢åŒã¯ç¹ã«JOINã®å€ãã¯ãšãªãè€éãªãã¹ããããã±ãŒã¹ã§ãåŠçã®æµããã€ããã®ã«é©ããŠããŸãã
ã©ã®åœ¢åŒã䜿ãã°ãããïŒ
䜿çšã·ãŒã³ | æšå¥šãã©ãŒããã |
---|---|
ååŠè ã§ç°¡åã«èŠãã | TRADITIONAL |
ããã°ã©ã ã§è§£æããã | JSON |
æ§é ããã¹ãã確èªããã | TREE |
ç®çã«å¿ããŠåœ¢åŒãéžã³ãæãèŠããããè§£æããããã¹ã¿ã€ã«ã§å®è¡èšç»ã確èªããŸãããã
4. å®è¡èšç»ã®èªã¿è§£ãæ¹
ãªãå®è¡èšç»ãèªãå¿ èŠãããã®ãïŒ
MySQLã®ã¯ãšãªã¯ãããŒã¿éãã€ã³ããã¯ã¹ã®æç¡ã«ãã£ãŠåŠçé床ã倧ããå€ãããŸããEXPLAIN ANALYZE
ã䜿ã£ãŠåºåãããå®è¡èšç»ãæ£ããèªã¿è§£ãããšã§ãã©ãã«ç¡é§ããããã©ããæ¹åããã°è¯ãã®ãã客芳çã«å€æã§ããããã«ãªããŸããç¹ã«ã倧éããŒã¿ãè€éãªçµååŠçãè¡ãã¯ãšãªã«ãããŠã¯ããã®ã¹ãã«ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®èŠãšãªããŸãã
å®è¡èšç»ã®åºæ¬æ§æ
EXPLAIN ANALYZE
ã®åºåã«ã¯ã以äžã®ãããªæ
å ±ãå«ãŸããŸãïŒTRADITIONAL圢åŒãåºæºã«è§£èª¬ïŒïŒ
-> Filter: (age > 30) (cost=0.35 rows=10) (actual time=0.002..0.004 rows=8 loops=1)
ãã®1è¡ã«ã¯ãè€æ°ã®éèŠãªæ å ±ãè©°ãŸã£ãŠããŸãã
é ç® | 説æ |
---|---|
Filter | æ¡ä»¶å¥ïŒWHEREãªã©ïŒã«è©²åœãããã£ã«ã¿åŠç |
cost | ã¯ãšãªå®è¡åã®æšå®ã³ã¹ã |
rows | æšå®ãããåŠçè¡æ°ïŒå®è¡åïŒ |
actual time | å®éã«ããã£ãæéïŒéå§ãçµäºïŒ |
actual rows | å®éã«åŠçãããè¡æ° |
loops | ãã®åŠçãç¹°ãè¿ãããåæ°ïŒãã¹ãæã«éèŠïŒ |
éèŠãªé ç®ã®èŠæ¹
1. cost
ãš actual time
cost
ã¯MySQLã®å éšèšç®ã«ãããã³ã¹ãã®èŠç©ãããã§ãå®è¡é床ã®çžå¯Ÿè©äŸ¡ã«äœ¿ãããŸããactual time
ã¯çŸå®ã«ããã£ãæéã§ãæ§èœåæã§ã¯ãã¡ããããéèŠã§ãã
ããšãã°ïŒ
(cost=0.35 rows=100) (actual time=0.002..0.004 rows=100)
ãã®ããã«ãæšå®ãšå®æž¬ãã»ãŒäžèŽããŠããã°ãå®è¡èšç»ã®ç²ŸåºŠã¯é«ããšèããããŸããéã«å·®ã倧ãããã°ãçµ±èšæ å ±ã®ç²ŸåºŠãäœãå¯èœæ§ããããŸãã
2. rows
ãš actual rows
rows
ã¯MySQLãäºæž¬ãããèªãäºå®ã®è¡æ°ãactual rows
ã¯å®éã«èªã¿åã£ãè¡æ°ïŒTRADITIONAL圢åŒã§ã¯æ¬åŒ§ã®äžã«å«ãŸããïŒ
ãã®2ã€ã«å€§ããªä¹é¢ãããå Žåãçµ±èšæ å ±ã®æŽæ°ãã€ã³ããã¯ã¹ã®èšèšèŠçŽããå¿ èŠã§ãã
3. loops
loops=1
ã§ããã°äžåºŠã ãã®å®è¡ã§ãããJOINããµãã¯ãšãªããããš loops=10
ã loops=1000
ãšå¢ããããšããããŸãããã®å€ã倧ããã»ã©ããã¹ããããã«ãŒãã«ãã£ãŠåŠçãéããªã£ãŠããå¯èœæ§ããããŸãã
å®è¡èšç»ã®ãã¹ãæ§é ãææ¡ãã
è€æ°ããŒãã«ã®JOINãããå Žåãå®è¡èšç»ã¯ããªãŒç¶ã«è¡šç€ºãããŸãïŒç¹ã«TREE圢åŒã§é¡èã§ãïŒã
äŸïŒ
-> Nested loop join
-> Table scan on users
-> Table scan on orders
åé¡ç¹
- äž¡ããŒãã«ãå šä»¶èµ°æ»ãããŠãããçµåã³ã¹ããé«ãã
察å¿ç
users.age
ã«ã€ã³ããã¯ã¹ã貌ããçµã蟌ã¿åŠçãå ã«è¡ãããšã§ãçµåå¯Ÿè±¡ãæžããã
ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã«ã¯ïŒ
以äžã®ãããªãã€ã³ãã«æ³šç®ãããšãããã«ããã¯ãèŠã€ããããããªããŸãã
- actual timeãé·ããrowsãå€ãããŒãïŒåŠçæéã®å€§éšåãå ãã
- full table scanãçºçããŠããç®æïŒã€ã³ããã¯ã¹æªäœ¿çšã®å¯èœæ§
- loopsãå€ãéšåïŒJOINé ããã¹ãã®éå¹çæ§ã瀺ã
- rowsãšactual rowsã®ä¹é¢ïŒçµ±èšã®äžæ£ç¢ºããéå°ãªããŒã¿ã¢ã¯ã»ã¹
ããããããšã«ãæ¬¡ç« ã§ç޹ä»ãããã¯ãšãªæé©åãã«æŽ»ãããŠããããšãéèŠã§ãã
5. ã¯ãšãªæé©åã®å®è·µäŸ
ã¯ãšãªæé©åãšã¯ïŒ
ã¯ãšãªæé©åãšã¯ãSQLæãããå¹ççã«å®è¡ã§ããããã«èŠçŽãäœæ¥ãæããŸããMySQLãå éšã§ã©ã®ããã«ã¯ãšãªãåŠçããŠãããïŒå®è¡èšç»ïŒãããšã«ãã€ã³ããã¯ã¹ã®è¿œå ãçµåé åºã®å€æŽãäžèŠãªåŠçã®åæžãªã©ãè¡ããŸãã
ããã§ã¯ãEXPLAIN ANALYZE
ãçšããŠãå®éã«ã©ã®ããã«ã¯ãšãªãæ¹åã§ããã®ãããå
·äœçãªäŸãšãšãã«ç޹ä»ããŸãã
äŸ1ïŒã€ã³ããã¯ã¹ã®æŽ»çšã«ããé«éå
æé©ååã®ã¯ãšãª
SELECT * FROM users WHERE email = 'example@example.com';
å®è¡èšç»ã®äžéš
-> Table scan on users (cost=10.5 rows=100000) (actual time=0.001..0.230 rows=1 loops=1)
åé¡ç¹
Table scan
ãšããéããå šä»¶èµ°æ»ãè¡ãããŠãããããŒã¿ä»¶æ°ãå€ããšé å»¶ã®åå ã«ãªããŸãã
察å¿çïŒã€ã³ããã¯ã¹ã®è¿œå
CREATE INDEX idx_email ON users(email);
æé©ååŸã®å®è¡èšç»
-> Index lookup on users using idx_email (cost=0.1 rows=1) (actual time=0.001..0.002 rows=1 loops=1)
çµæ
- å®è¡æéãå€§å¹ ã«ççž®ã
- ã€ã³ããã¯ã¹ã«ãããäžèŠãªå šä»¶èµ°æ»ãåé¿ã

äŸ2ïŒçµåé åºã®æé©å
æé©ååã®ã¯ãšãª
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.age > 30;
å®è¡èšç»ã®äžéš
-> Nested loop join
-> Table scan on orders
-> Table scan on users
åé¡ç¹
- äž¡ããŒãã«ãå šä»¶èµ°æ»ãããŠãããçµåã³ã¹ããé«ãã
察å¿ç
users.age
ã«ã€ã³ããã¯ã¹ã貌ããçµã蟌ã¿åŠçãå ã«è¡ãããšã§ãçµåå¯Ÿè±¡ãæžããã
CREATE INDEX idx_age ON users(age);
æé©ååŸã®å®è¡èšç»
-> Nested loop join
-> Index range scan on users using idx_age
-> Index lookup on orders using idx_user_id
çµæ
- JOIN察象ãå ã«çµã蟌ãŸããå šäœã®åŠçè² è·ãæžå°ã
äŸ3ïŒãµãã¯ãšãªã®èŠçŽã
æé©ååã®ã¯ãšãª
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);
åé¡ç¹
- ãµãã¯ãšãªãå®è¡ããšã«è©äŸ¡ãããããã©ãŒãã³ã¹ãäœäžããã
察å¿çïŒJOINã«æžãæã
SELECT DISTINCT users.*
FROM users
JOIN orders ON users.id = orders.user_id
WHERE orders.total > 1000;
çµæ
- å®è¡èšç»ã§ã¯JOINãæé©åãããã€ã³ããã¯ã¹ã䜿ããããããªãã
Before/Afterã®æ¯èŒãéµ
EXPLAIN ANALYZE
ã䜿ãããšã§ãæé©åã®å¹æãã宿ž¬å€ãã§ç¢ºèªã§ããŸããæ¹åååŸã§ã®å®è¡æéãè¡æ°ã®å€åãèŠãããšã§ãåãªãããã£ãã€ãããã§çµãããã確å®ãªãã¥ãŒãã³ã°ãå¯èœã«ãªããŸãã
æé©åã«ãããæ³šæç¹
- éå°ãªã€ã³ããã¯ã¹è¿œå ã¯é广ã«ãªãå ŽåãããïŒINSERT/UPDATEæ§èœã®äœäžïŒã
- å®è¡èšç»ã¯ããŒã¿éãçµ±èšæ å ±ã«äŸåãããããç°å¢ããšã«ç¢ºèªãå¿ èŠã
- äžã€ã®æé©åã§å šãŠãéããªããšã¯éããªããããã«ããã¯åæãæåªå ã
6. 泚æç¹ãšãã¹ããã©ã¯ãã£ã¹
EXPLAIN ANALYZE
å©çšæã®æ³šæç¹
EXPLAIN ANALYZE
ã¯éåžžã«åŒ·åãªããŒã«ã§ãããæ£ãã䜿ããªããšéã«èª€è§£ããã©ãã«ãæãæãããããŸãã以äžã®æ³šæç¹ãæèããããšã§ãå®å
šãã€å¹æçã«ã¯ãšãªã®åæãšæé©åãå¯èœã«ãªããŸãã
1. æ¬çªç°å¢ã§ã¯å®æã«å®è¡ããªã
EXPLAIN ANALYZE
ã¯ãã¯ãšãªãå®éã«å®è¡ãããããæŽæ°ç³»ã®SQLæïŒINSERTïŒUPDATEïŒDELETEãªã©ïŒã誀ã£ãŠäœ¿ããšãããŒã¿ã倿ŽãããŠããŸãå±éºããããŸãã
SELECT
æä»¥å€ã§ã¯åºæ¬çã«äœ¿ããªãããã«ããŸãããã- æ¬çªããŒã¿ã§ã®å®è¡ã¯é¿ããæ€èšŒçšã®ç°å¢ã§è¡ãã®ãååã§ãã
2. ãã£ãã·ã¥ã®åœ±é¿ãèæ ®ãã
MySQLã¯åãã¯ãšãªãç¹°ãè¿ããšãããŒã¿ããã£ãã·ã¥ããè¿ãããšããããŸãããã®ãããEXPLAIN ANALYZE
ã®å®è¡æéã宿
ãšç°ãªãããšããããŸãã
察çïŒ
- å®è¡åã«ãã£ãã·ã¥ãã¯ãªã¢ïŒ
RESET QUERY CACHE;
ïŒããã - è€æ°åå®è¡ããŠãã°ãã€ãã®ãªãå¹³åå€ãåãã
3. çµ±èšæ å ±ãæŽæ°ããããšãåæ
MySQLã¯ã€ã³ããã¯ã¹ãã«ã©ã ã®çµ±èšæ
å ±ã«åºã¥ããŠå®è¡èšç»ãç«ãŠãŸããããããå€ããªã£ãŠãããšãEXPLAIN
ã ANALYZE
ãæ£ããæ
å ±ãè¿ããŸããã
ç¹ã«å€§éã®INSERT/DELETEããã£ãåŸã¯ãANALYZE TABLE
ã§çµ±èšãæŽæ°ããŠãããŸãããã
ANALYZE TABLE users;
4. ã€ã³ããã¯ã¹ã¯äžèœã§ã¯ãªã
ã€ã³ããã¯ã¹ã远å ããããšã§é«éåã§ããã±ãŒã¹ã¯å€ãã§ãããã€ã³ããã¯ã¹ãå€ããããšãæžã蟌ã¿ç³»ã®åŠçãé ããªããšããå¯äœçšããããŸãã
ãŸããè€åã€ã³ããã¯ã¹ãšåäžã€ã³ããã¯ã¹ã®éžæãéèŠã§ãã䜿çšé »åºŠãæ€çŽ¢æ¡ä»¶ã«å¿ããŠãé©åãªã€ã³ããã¯ã¹èšèšãå¿ãããŸãããã
5. å®è¡æéã ãã§å€æããªã
EXPLAIN ANALYZE
ã®çµæã¯ããããŸã§ã¯ãšãªåäœã®ããã©ãŒãã³ã¹ã瀺ããã®ã§ããã¢ããªã±ãŒã·ã§ã³å
šäœã§èŠããšããããã¯ãŒã¯é
å»¶ãããã¯ãšã³ãåŠçãªã©ãä»ã®èŠçŽ ãããã«ããã¯ã«ãªãããšããããŸãã
ãããã£ãŠãå šäœèšèšã®äžã§ã¯ãšãªã®åœ¹å²ãçè§£ããããã§ã®åæãæ±ããããŸãã
ãã¹ããã©ã¯ãã£ã¹ãŸãšã
ãã€ã³ã | 宿œå 容 |
---|---|
æ¬çªç°å¢ã®äœ¿çšæ³šæ | SELECTéå®ã§äœ¿ããæŽæ°ç³»ã§ã¯äœ¿ããªã |
ãã£ãã·ã¥å¯Ÿç | å®è¡åã«ãã£ãã·ã¥ã¯ãªã¢ãå¹³åå€ã§å€æ |
çµ±èšæ å ±ã®æŽæ° | ANALYZE TABLEã§å®æçã«çµ±èšãæŽå |
ã€ã³ããã¯ã¹ã®ãã©ã³ã¹èšèš | èªã¿æžãã®æ¯çãèŠãŠãå¿ èŠæå°éã«çãã |
ã¯ãšãªåäœã«ãšããããããªãããš | ã¢ããªå šäœã®äžã§æé©åãã¹ãç¹ãèŠæ¥µãã |
7. ãããã質åïŒFAQïŒ
Q1. EXPLAIN ANALYZE
ã¯ã©ã®ããŒãžã§ã³ããå©çšã§ããŸããïŒ
A.
MySQLã® EXPLAIN ANALYZE
㯠ããŒãžã§ã³8.0.18以é ã«å°å
¥ãããæ©èœã§ãã8.0ããåã®ããŒãžã§ã³ã§ã¯ãµããŒããããŠããŸããã®ã§ãå©çšããå Žåã¯MySQLã®ããŒãžã§ã³ç¢ºèªãå¿
èŠã§ãã
Q2. EXPLAIN ANALYZE
ãå®è¡ãããšãããŒã¿ã倿Žãããããšã¯ãããŸããïŒ
A.
åºæ¬çã« EXPLAIN ANALYZE
ã¯ã¯ãšãªãå®è¡ããã«åæãè¡ããããSELECTæã§ããã°ããŒã¿ã®å€æŽã¯çºçããŸããã
ãããããã誀ã£ãŠ INSERT
ã UPDATE
ãªã©ã䜿ã£ãå Žåãéåžžã®ã¯ãšãªåæ§ã«ããŒã¿ã倿ŽãããŠããŸããŸãã
â»å®å
šã®ãããåæã«ã¯ æ€èšŒçšã®ãã¹ãããŒã¿ããŒã¹ã§å®è¡ããããšãæšå¥šããŸãã
Q3. EXPLAIN
ã ãã§ã¯ãã¡ãªã®ã§ããïŒ
A.EXPLAIN
ã¯å®è¡èšç»ã®ãæšå®ãã確èªããã«ã¯ååã§ãããå®éã«ã©ããããæéãããã£ãããã©ã®ãããã®è¡æ°ãåŠçãããããšãã£ã宿ž¬å€ã¯åºåãããŸããã
æ¬æ Œçã«ã¯ãšãªãã¥ãŒãã³ã°ãè¡ãããå Žåãã广æ€èšŒãå¿
èŠãªå Žåã¯ãEXPLAIN ANALYZE
ã®æ¹ãæçšã§ãã
Q4. åºåããããloopsãããactual timeããªã©ã®æ°å€ã¯ãã©ã®çšåºŠæ£ç¢ºã§ããïŒ
A.actual time
ã loops
ã®æ°å€ã¯ãMySQLãå
éšçã«èšæž¬ããå®è¡æã®ãªã¢ã«ãªæ
å ±ã§ãããã ããOSã®ç¶æ³ããã£ãã·ã¥ç¶æ
ããµãŒããŒã®è² è·ãªã©ã«ãã£ãŠåŸ®åŠã«å€åããŸãã
ãã®ããã1åã ãã§å€æãããè€æ°åã®å®è¡ã§åŸåãèŠãã®ãçæ³ã§ãã
Q5. å®è¡çµæã®ãcostãã£ãŠå ·äœçã«äœã衚ããŠããã®ã§ããïŒ
A.cost
ã¯MySQLå
éšã®ã³ã¹ãã¢ãã«ã«ããæšå®å€ã§ãããCPUã»I/Oã³ã¹ããªã©ãçžå¯Ÿçã«è©äŸ¡ããææšã§ããåäœã¯å®æéïŒç§ïŒã§ã¯ãªãããããããŸã§çžå¯Ÿçãªåªå£ãèŠãããã«äœ¿ããŸãã
äŸãã° (cost=0.3)
ãš (cost=2.5)
ãããã°ãåŸè
ã®æ¹ãéãåŠçãšæšå®ããããšããæå³ã§ãã
Q6. JSON圢åŒãTREE圢åŒã䜿ããšãäœã䟿å©ãªã®ã§ããïŒ
A.
- JSON圢åŒïŒæ§é åãããŠãããããã°ã©ã ã§è§£æãããããèªååããŒã«ãããã·ã¥ããŒãã«æŽ»çšããããã
- TREE圢åŒïŒåŠçã®æµãããã¹ãæ§é ãèŠèŠçã«çè§£ãããããè€éãªã¯ãšãªãJOINã®é åºãäžç®ã§ãããã
ããããçšéãç°ãªããããç®çã«å¿ããŠäœ¿ãåããã®ããã€ã³ãã§ãã
Q7. å®è¡èšç»ãèŠãŠæ¹åã§ããªãã£ãå Žåã¯ã©ãããã°ïŒ
A.
以äžã®ãããªè¿œå ææ®µãæ€èšãããšè¯ãã§ãããã
- ã€ã³ããã¯ã¹ã®åèšèšïŒè€åã€ã³ããã¯ã¹ãã«ããªã³ã°ã€ã³ããã¯ã¹ïŒ
- ã¯ãšãªèªäœã®æžãæãïŒãµãã¯ãšãªâJOINãäžèŠãªSELECTåã®åé€ïŒ
- ãã¥ãŒãäžæããŒãã«ã®æŽ»çš
- MySQLã®æ§æïŒbuffer sizeçïŒã®èŠçŽã
ãã¥ãŒãã³ã°ã¯1ã€ã®æ¹æ³ã ãã§å®çµããããšã¯å°ãªããããè€åçã«èããããšã倧åã§ãã