
ãã®èšäºã§ã¯ãã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã®æ©èœã®ç解ã«åºã¥ããŠãéåžžã«è€éãªBadooã·ã¹ãã ãæé©åãã2ã€ã®å®éã®äŸã瀺ããŸãã
ã¯ã©ã¹ã¿åã€ã³ããã¯ã¹ -ããŒãã«ããã¡ã€ã«ã«ç·šæãã圢åŒã InnoDBã§ã¯ãããŒã¿ã¯éåžžã®B-TREEããŒãšåãããªãŒå ã®ããªãŒã«ä¿åãããŸãã InnoDBããŒãã«èªäœã¯ãã§ã«å€§ããªB-TREEã§ãã ããŒå€ã¯ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã§ãã ããã¥ã¡ã³ãã«ãããšãPRIMARY KEYãã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ãšããŠéžæãããŠããŸãã äž»ããŒããªãå Žåãæåã®äžæã®ããŒãéžæãããŸãã ããã§ãªãå Žåã¯ãå éšã®6ãã€ãã³ãŒãã䜿çšãããŸãã
ãã®ãããªãã£ã¹ã¯äžã®ããŒã¿ã®çµç¹ããäœãèµ·ãããŸããïŒ
- ããŒãåæ§ç¯ããå¿ èŠããããããããŒãã«ã®äžå€®ã«æ¿å ¥ãããšæéããããå ŽåããããŸãã
- è¡ã®ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹å€ãæŽæ°ãããšããã£ã¹ã¯äžã®æ å ±ãç©ççã«è»¢éãããããæçåãããŸãã
- ããŒãã«ã«ãã°ããæ¿å ¥ããããã«ãã¯ã©ã¹ã¿åã€ã³ããã¯ã¹ã®å¢ãç¶ããå€ã䜿çšããå¿ èŠæ§ã æãæé©ãªã®ã¯èªåã€ã³ã¯ãªã¡ã³ããã£ãŒã«ãã§ãã
- åè¡ã«ã¯ãäžæã®èå¥åå€ã§ããã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ããããŸãã
- äºæ¬¡ããŒã¯ãåã«ãããã®äžæã®èå¥åãåç §ããŸãã
- å®éãKEY `key`ïŒaãbãcïŒãšãã圢åŒã®2次ããŒã¯ãæ§é KEY` key`ïŒaãbãcãclustered_indexïŒãæã¡ãŸãã
- ãã£ã¹ã¯äžã®ããŒã¿ã¯ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã§äžŠã¹æ¿ããããŸãïŒSSDã®äŸã¯èæ ®ããŠããŸããïŒã
ã¹ã¯ãªããã®äœæ¥ãå€§å¹ ã«é«éåããã®ã«åœ¹ç«ã€2çš®é¡ã®æé©åã«ã€ããŠèª¬æããŸãã
ãã¹ãç°å¢
調æ»ã®çµæã«å¯Ÿãããã£ãã·ã¥ã®åœ±é¿ã軜æžããã«ã¯ããµã³ãã«ã«SQL_NO_CACHEãè¿œå ããŸãããŸããåãªã¯ãšã¹ãã®åã«ãã¡ã€ã«ã·ã¹ãã ãã£ãã·ã¥ããã©ãã·ã¥ããŸãã ãããŠããªããªã ããŒã¿ãå®éã«ãã£ã¹ã¯ãããã«ããå¿ èŠãããææªã®ã±ãŒã¹ã«èå³ããããŸããåãªã¯ãšã¹ãã®åã«MySQLãåèµ·åããŸãã
è£ åå
- ã€ã³ãã«Â®Pentium®ãã¥ã¢ã«CPU E2180 @ 2.00GHz
- RAM DIMM 800 MHz 4Gb
- Ubuntu 11.04
- MySQL 5.5
- HDD Hitachi HDS72161
ãã£ãŒããªãã®æé©å
ããšãã°ããŠãŒã¶ãŒéä¿¡ãå«ãæœè±¡ããŒãã«ã¡ãã»ãŒãžãèããŸãã
CREATE TABLEã¡ãã»ãŒãžïŒ message_id int not null auto_incrementã user1 intã¯nullã§ã¯ãããŸããã user2 intã¯nullã§ã¯ãããŸããã tsã¿ã€ã ã¹ã¿ã³ãnull以å€ã®ããã©ã«ãcurrent_timestampã æ¬æã®ãã³ã°ããã¹ãããã«ã§ã¯ãããŸããã äž»ããŒïŒmessage_idïŒã KEYïŒuser1ãuser2ãtsïŒ ïŒãšã³ãžã³= InnoDB
InnoDBã®ãªã¹ããããæ©èœãèæ ®ããŠããã®è¡šãæ€èšããŠãã ããã
ããã®ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã¯ãPRIMARY KEYãšäžèŽããèªåã€ã³ã¯ãªã¡ã³ããã£ãŒã«ãã§ãã åè¡ã«ã¯4ãã€ãã®èå¥åããããŸãã ããŒãã«ã«æ°ããè¡ãæ¿å ¥ããã®ãæé©ã§ãã ã»ã«ã³ããªããŒã¯å®éã«ã¯KEYïŒuser1ãuser2ãtsãmessage_idïŒã§ãããããã䜿çšããŸãã
ããŒãã«ã«1åã®ã¡ãã»ãŒãžãè¿œå ããŸãã ããã¯ãInnoDBã®å¿ èŠãªæ©èœãèå¥ããã®ã«ååã§ãã ã·ã¹ãã ã«ã¯10人ã®ãŠãŒã¶ãŒãããªãããã察è«è ã®åãã¢ã«ã¯å¹³å100äžã®ã¡ãã»ãŒãžããããŸãã
ãããã®10人ã®ãã¹ããŠãŒã¶ãŒãå€ãã®ã¡ãã»ãŒãžã亀æãããã°ãã°å€ãéä¿¡ãèªã¿çŽãããšä»®å®ããŸããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããšãéåžžã«å€ãã¡ãã»ãŒãžã®ããããŒãžã«åãæ¿ããããšãã§ããŸãã ãããŠããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®èåŸã«ã¯åçŽãªãªã¯ãšã¹ãããããŸãïŒ
SELECT * FROM messages WHERE user1=1 and user2=2 order by ts limit 20 offset PageNumber*20
å®éãæãäžè¬çãªèŠæ±ã ãªãã»ããã®æ·±ãã«å¿ããŠãå®è¡æãèŠãŠã¿ãŸãããã
ãªãã»ãã | å®è¡æéïŒããªç§ïŒ |
---|---|
100 | 311 |
1000 | 907 |
5000 | 3372 |
10,000 | 6176 |
20000 | 11901 |
30000 | 17057 |
40,000 | 21997 |
50,000 | 28268 |
60,000 | 32805 |

確ãã«å€ãã®äººãç·åœ¢æé·ãæåŸ ããŠããŸãã ãããã6äžä»¶ã®ã¬ã³ãŒãã§33ç§ãååŸããã®ã¯å€ãããŸãïŒ æéããããããšã説æããã®ã¯éåžžã«ç°¡åã§ããMySQLå®è£ ã®æ©èœã®1ã€ã«èšåããã ãã§ãã å®éããã®ã¯ãšãªãèªã¿åãMySQLã¯ããã£ã¹ã¯ããè¡ã®ãªãã»ãã+å¶éãåŒãããããããå¶éãè¿ããŸãã ããã§ç¶æ³ã¯æããã§ãããã®éãMySQLã¯6äžä»¶ã®äžèŠãªè¡ããã£ã¹ã¯ããèªã¿åã£ãŠããŸããã åæ§ã®ç¶æ³ã§äœããã¹ããïŒ ããã«ã¯å€ãã®ç°ãªã解決çãå¿ èŠã§ãã ãšããã§ãããã«ããããã®ãªãã·ã§ã³ã«é¢ããèå³æ·±ãèšäºããããŸãã
éåžžã«ç°¡åãªãœãªã¥ãŒã·ã§ã³ãèŠã€ãããŸãããæåã®ã¯ãšãªã¯ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹å€ã®ã¿ãéžæãããããããæä»çã«éžæããŸããã ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹å€ã¯ã»ã«ã³ããªããŒã®æåŸã«ååšããããšãããã£ãŠããããããªã¯ãšã¹ãå ã®*ãmessage_idã«çœ®ãæãããšãããŒã®ã¿ã§æ©èœãããªã¯ãšã¹ããååŸããŸãããã®ãããªãªã¯ãšã¹ãã®é床ã¯é«éã§ãã
ããã¯ïŒ
mysql>ã¯ãuser1 = 1ããã³user2 = 2ã§ãtså¶é20ãªãã»ãã20000ã«ããã¡ãã»ãŒãžããã®select *ã説æããŸãã + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- -------- + | id | select_type | ããŒãã«| ã¿ã€ã| possible_keys | ããŒ| key_len | ref | è¡| ãšã¯ã¹ãã©| + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- -------- + | 1 | ã·ã³ãã«| ã¡ãã»ãŒãž| ref | user1 | user1 | 8 | constãconst | 210122 | whereã䜿çšãã| + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- -------- + ã»ããå ã®1è¡ïŒ0.00ç§ïŒ
次ã®ããã«ãªããŸããïŒ
mysql>ã¯ãuser1 = 1ããã³user2 = 2ã®ã¡ãã»ãŒãžããselect message_idã説æããŸãã + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- --------------------- + | id | select_type | ããŒãã«| ã¿ã€ã| possible_keys | ããŒ| key_len | ref | è¡| ãšã¯ã¹ãã©| + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- --------------------- + | 1 | ã·ã³ãã«| ã¡ãã»ãŒãž| ref | user1 | user1 | 8 | constãconst | 210122 | whereã䜿çšããŸãã ã€ã³ããã¯ã¹ã䜿çšãã| + ---- + ------------- + ---------- + ------ + ------------ --- + ------- + --------- + ------------- + -------- + ----- --------------------- + ã»ããå ã®1è¡ïŒ0.00ç§ïŒ
ãã®å Žåã«ã€ã³ããã¯ã¹ã䜿çšãããšãMySQLã¯ã»ã«ã³ããªããŒãããã¹ãŠã®ããŒã¿ãååŸã§ããã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ã«ã¢ã¯ã»ã¹ã§ããªããªããŸãã 詳现ã«ã€ããŠã¯ã ãã¡ããã芧ãã ããã
ãããŠä»ãã¯ãšãªã§æååå€ãçŽæ¥æœåºããã ãã§ã
SELECT * FROM messages WHERE message_id IN (....)
ãã®ãœãªã¥ãŒã·ã§ã³ã®çç£æ§ãèŠãŠã¿ãŸãããã
ãªãã»ãã | å®è¡æéïŒããªç§ïŒ |
---|---|
100 | 243 |
1000 | 164 |
5000 | 213 |
10,000 | 337 |
20000 | 618 |
30000 | 756 |
40,000 | 971 |
50,000 | 1225 |
60,000 | 1477 |

éæãããçµæã¯å šå¡ã«é©ããŠããããããã以äžã®æ€çŽ¢ãè¡ããªãããšã«æ±ºå®ããŸããã ããã«ãå±¥æŽèªäœãæäœããæé ãå€æŽããã«ãååãšããŠãã®ããŒã¿ã«é«éã«ã¢ã¯ã»ã¹ã§ãããã©ããã¯äžæã§ãã ã¿ã¹ã¯ã¯ãããŒã¿æ§é èªäœã§ã¯ãªããç¹å®ã®ã¯ãšãªãæé©åããããšã§ããã
倧ããªããŒãã«ãæŽæ°ããæé ãæé©åãã
1æ¥1åããŠãŒã¶ãŒã«é¢ããé¢é£ããŒã¿ã1ã€ã®å€§ããªããŒãã«ã«åéããå¿ èŠããããšãã«ã2çªç®ã®æé©åã®å¿ èŠæ§ãçããŸããã åœæã1å3åäžäººã®ãŠãŒã¶ãŒãããŸããã ãã¹ãŠã®ããŒã¿ããŒã¹ããã€ãã¹ããŠæ°ããããŒã¿ãåéããã¹ã¯ãªããã¯ã30åã§å®è¡ããã3000äžã®å€æŽãããè¡ãéžæããŸãã ã¹ã¯ãªããã®çµæã¯ãããŒããã©ã€ãã«ã·ãªã¢ã«åãããæ°ããå€ãæã€æ°äžã®ããã¹ããã¡ã€ã«ã§ãã åãã¡ã€ã«ã«ã¯ãæ°çŸäººã®ãŠãŒã¶ãŒã«é¢ããæ å ±ãå«ãŸããŠããŸãã
ãããã®ããã¹ããã¡ã€ã«ããããŒã¿ããŒã¹ã«æ å ±ã転éããŸãã ãã¡ã€ã«ãé çªã«èªã¿åããè¡ãæ°åã®ããã¯ã«ã°ã«ãŒãåããŠæŽæ°ããŸãã ã¹ã¯ãªããã®å®è¡æéã¯3ã20æéã§ãã åœç¶ããã®ã¹ã¯ãªããã®åäœã¯åãå ¥ããããŸããã ããã«ãããã»ã¹ãæé©åããå¿ èŠãããããšã¯æããã§ãã
æåã«çãããã®ã¯ãããŒã¿ããŒã¹ãµãŒããŒã®ãã£ã¹ã¯äžã®ãå¯çãè² è·ã§ããã ããããå€æ°ã®èŠ³å¯ãããã®ä»®èª¬ã®èšŒæ ã¯æããã«ãããŠããŸããã ç§ãã¡ã¯ãåé¡ã¯ããŒã¿ããŒã¹ã®è žã«ãããšããçµè«ã«éããŸããããããŠããããã©ãä¿®æ£ããããèããå¿ èŠããããŸãã ããŒã¿ã¯ãã£ã¹ã¯äžã«ã©ã®ããã«é 眮ãããŸããïŒ ãã®ããŒã¿ãæŽæ°ããã«ã¯ãOSãMySQLãããã³ããŒããŠã§ã¢ã¯äœãããªããã°ãªããŸãããïŒ ãããã®è³ªåã«çããŠããéã«ãããŒã¿ãåéãããã®ãšåãé åºã§æŽæ°ãããããšã«æ°ä»ããŸããã ããã¯ãåèŠæ±ããã®å€§ããªããŒãã«å ã®å®å šã«ã©ã³ãã ãªå ŽæãæŽæ°ããããšãæå³ãããã£ã¹ã¯ãããã®é 眮æéã®æ倱ããã¡ã€ã«ã·ã¹ãã ãã£ãã·ã¥ã®æ倱ãããŒã¿ããŒã¹ãã£ãã·ã¥ã®æ倱ã䌎ããŸãã
MySQLã®åè¡ãæŽæ°ããããã»ã¹ã¯ãå€ã®æžç®ãå€ãå€ãšæ°ããå€ã®æ¯èŒãå€ã®æžã蟌ã¿ã®3ã€ã®æ®µéã§æ§æãããŠããããšã«æ³šæããŠãã ããã ããã¯ãã¯ãšãªã®çµæãšããŠãMySQLãäžèŽããè¡æ°ãšå®éã«æŽæ°ãããè¡æ°ã«å¿çãããšããäºå®ãããèŠãããšãã§ããŸãã
次ã«ãããŒãã«å ã§å®éã«å€æŽãããè¡ã®æ°ã調ã¹ãŸããã 3000äžè¡ã®ãã¡ãå€æŽãããã®ã¯300äžè¡ã®ã¿ã§ãïŒããã¯è«ççã§ãããªããªããããŒãã«ã«ã¯ãŠãŒã¶ãŒã«é¢ããéåžžã«åãæšãŠãããæ å ±ãå«ãŸããŠããããã§ãïŒã ããã¯ãMySQLãæŽæ°ã§ã¯ãªãæ ¡æ£ã«è²»ããæéã®90ïŒ ãæå³ããŸãã ãœãªã¥ãŒã·ã§ã³ã¯åç¬ã§æäŸãããŸãããã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ãžã®ã©ã³ãã ã¢ã¯ã»ã¹ãã·ãŒã±ã³ã·ã£ã«ã€ã³ããã¯ã¹ã«ã©ã®ããã«å€±ããããã確èªããå¿ èŠããããŸãã çµæã¯ãããŒãã«ãæŽæ°ããå Žåã«äžè¬åã§ããŸãïŒæŽæ°ããåã«ãæžç®ãšæ¯èŒãè¡ãããŸãïŒã
ãã®ææ³ã¯éåžžã«åçŽã§ã-ã¯ãšãªã®å®è¡é床ã®éãã枬å®ããŸã
SELECT * FROM messages where message_id in ($values)
ããã§ãå€ã¯10KèŠçŽ ã®é åãæž¡ããŸãã ã©ã³ãã ã¢ã¯ã»ã¹ããã§ãã¯ããã«ã¯ãèŠçŽ å€ãå®å šã«ã©ã³ãã ã«ããŸãã ã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã»ã¹ããã¹ãããã«ã¯ãã©ã³ãã ãã€ã¢ã¹ããå§ããŠ10KèŠçŽ ãã·ãŒã±ã³ã·ã£ã«ã«äœæããå¿ èŠããããŸãã
é¢æ°getValuesForRandomAccessïŒïŒ{ $ arr = arrayïŒïŒ; foreachïŒç¯å²ïŒ1ã10000ïŒãšããŠ$ iïŒ{ $ arr [] = randïŒ1,100000000ïŒ; } return arr; } é¢æ°getValuesForSequencialAccessïŒïŒ{ $ r = randïŒ1ã100000000-10000ïŒ; æ»ãç¯å²ïŒ$ rã$ r + 10000ïŒ; }
ã©ã³ãã ããã³ã·ãŒã±ã³ã·ã£ã«ãªã¯ãšã¹ãã®å®è¡æéïŒ
N | ã©ã³ãã | ã·ãŒã±ã³ã·ã£ã« |
---|---|---|
1 | 38494 | 171 |
2 | 40409 | 141 |
3 | 40868 | 147 |
4 | 37161 | 138 |
5 | 38189 | 137 |
6 | 36930 | 134 |
7 | 37398 | 176 |
8 | 38035 | 144 |
9 | 39722 | 140 |
10 | 40720 | 146 |
ã芧ã®ãšãããå®è¡æéã®å·®ã¯200åã§ãã ãããã£ãŠãç§ãã¡ã¯ããã®ããã«æŠããªããã°ãªããŸããã å®è¡ãæé©åããã«ã¯ããœãŒã¹ããŒã¿ãäž»ããŒã§äžŠã¹æ¿ããå¿ èŠããããŸãã ãã¡ã€ã«å ã®3000äžã®å€ããã°ããæŽçã§ããŸããïŒ çãã¯æ確ã§ã-ã§ããŸãïŒ
ãã®æé©åã®åŸãã¹ã¯ãªããã®å®è¡æéã¯2.5æéã«ççž®ãããŸããã 3000äžè¡ã®äºåãœãŒãã«ã¯30åããããŸãïŒãŸããgzipã¯ã»ãšãã©ã®æéãããããŸãïŒã
åãæé©åããã ãSSD
èšäºãæžããåŸã1ã€ã®äœåãªSSDãèŠã€ãããã®äžã§ãã¹ãããŸããã
ãã£ãŒããªãã»ãããµã³ããªã³ã°ïŒ
ãªãã»ãã | å®è¡æéïŒããªç§ïŒ |
---|---|
100 | 117 |
1000 | 406 |
5000 | 1681 |
10,000 | 3322 |
20000 | 6561 |
30000 | 9754 |
40,000 | 13039 |
50,000 | 16293 |
60,000 | 19472 |
æé©åããããã£ãŒããªãã»ãããµã³ããªã³ã°ïŒ
ãªãã»ãã | å®è¡æéïŒããªç§ïŒ |
---|---|
100 | 101 |
1000 | 21 |
5000 | 24 |
10,000 | 32 |
20000 | 47 |
30000 | 94 |
40,000 | 84 |
50,000 | 95 |
60,000 | 120 |
ã©ã³ãã ã¢ã¯ã»ã¹ãšã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã»ã¹ã®æ¯èŒïŒ
N | ã©ã³ãã | ã·ãŒã±ã³ã·ã£ã« |
---|---|---|
1 | 5321 | 118 |
2 | 5583 | 118 |
3 | 5881 | 117 |
4 | 6167 | 117 |
5 | 6349 | 120 |
6 | 6402 | 126 |
7 | 6516 | 125 |
8 | 6342 | 124 |
9 | 6092 | 118 |
10 | 5986 | 120 |
ãããã®å³ã¯ãSSDãåŸæ¥ã®ãã©ã€ããããåªããŠããããšã瀺ããŠããŸããããã®äœ¿çšã¯æé©åã®å¿ èŠæ§ãæé€ããŸããã
ãããŠããã®èšäºã®çµè«ãšããŠãããŒã¿ãµã³ããªã³ã°ã¬ãŒãã20åã«å¢ããããšãã§ãããšèšããŸãã ããŒãã«ã®å®éã®æŽæ°ãæ倧10åã«å éããŸããïŒä»£çãã¹ãã¯200åã«å éããŸããïŒã å®éšã¯ããã£ãã·ã¥ãç¡å¹ã«ãªã£ãŠããã·ã¹ãã ã§å®è¡ãããããšãæãåºããŠãã ããã å®éã®ã·ã¹ãã ã§ã®ã²ã€ã³ã¯ããã»ã©å°è±¡çã§ã¯ãããŸããã§ããïŒãã£ãã·ã¥ã¯ç¶æ³ãããä¿®æ£ããŸãïŒã
åè¿°ã®çµè«ã¯è¡šé¢ã«ãããŸãã䜿çšãããœãããŠã§ã¢ã®é·æãšçæãç¥ãã ãã§ã¯ååã§ã¯ãããŸããããã®ç¥èãå®è·µã§ããããšãéèŠã§ãã MySQLã®å éšæ§é ãç¥ã£ãŠãããšãã¯ãšãªãæ°ååé«éåã§ããå ŽåããããŸãã
Alexey alexxz EremikhinãBadooéçºè