ããã«ã¡ã¯ããµã¼ãã¹éçºé¨ã®èå¼ (@a_bicky) ã§ãã
çªç¶ã§ãããRDBMS ã®æ¢åã®ãã¼ãã«ãè¦ã¦ã¿ãããä½ã§ãããªã«ã¤ã³ããã¯ã¹ã ãããªã®ï¼ãã¿ãããªçµé¨ã¯ããã¾ãããï¼ä¸è¦ãªã¤ã³ããã¯ã¹ã¯å®¹éãå§è¿«ããããæ¿å ¥ãé ããªã£ããã¨è¯ããã¨ãããã¾ããã
ãããªããã§ãä»åã¯ã¬ã³ã¼ããæ¤ç´¢ããããã«å¿ è¦ãªã¤ã³ããã¯ã¹ã®åºç¤ç¥èã¨ãããè¦ãããä¸é©åãªã¤ã³ããã¯ã¹ã«ã¤ãã¦è§£èª¬ãã¾ããã¯ãã¯ãããã§ã¯ Rails ã®ãã¼ã¿ãã¼ã¹ã¨ãã¦ä¸»ã« MySQL 5.6ãMySQL ã®ã¹ãã¬ã¼ã¸ã¨ã³ã¸ã³ã¨ãã¦ä¸»ã« InnoDB ã使ã£ã¦ããã®ã§ãMySQL 5.6 ã® InnoDB ã«ã¤ãã¦è§£èª¬ãã¾ãã
InnoDB ã®ã¤ã³ããã¯ã¹ã«é¢ããåºç¤ç¥è
ã¤ã³ããã¯ã¹ã®æ§é (B+ æ¨)
InnoDB ã§ã¯ B+ æ¨ã使ããã¦ãã¾ããB+ æ¨ã¯æ¬¡ã®ãããªç¹å¾´ãæã£ãæ¨æ§é ã§ãã
- 次æ°ã b ã¨ããã¨ãåå é¨ãã¼ãï¼èãã¼ã以å¤ã®ãã¼ãï¼ã¯æ大 b - 1 åã®ãã¼ã¨æ大 b åã®åãã¼ããæã¤*1
- å é¨ãã¼ãã¯å¤ãæããªã
- èãã¼ãã®åãã¼ã¯å¤ï¼ã¾ãã¯å¤ã¸ã®ãã¤ã³ã¿ï¼ãæã¤
- èãã¼ãã¯æ¬¡ã®èãã¼ãã¸ã®ãã¤ã³ã¿ãæã¤
ã§æ¤ç´¢ã§ãã
次ã®å³ã¯æ¬¡æ° 3 ã®ä¾ã§ãã
ä¾ãã°ãkey ã 4 ã® value ãåãåºãã«ã¯æ¬¡ã®ããã«æ¨ã辿ãã°è¯ãã§ãã
key ã 2 ã 9 ã® value ãå ¨ã¦åãåºãã«ã¯æ¬¡ã®ããã«æ¨ã辿ããã¨ãã§ãã¾ããèãã¼ãéãç¹ãã£ã¦ãããã¨ã«ãã£ã¦ç¯å²æ¤ç´¢ãå¹ççã«è¡ããã¨ãã§ãã¾ãã
InnoDB ã® B+ æ¨ã§ã¯ãã¤ã³ããã¯ã¹ã«ä½¿ããã¦ããã«ã©ã ã®å¤ã¨ä¸»ãã¼ã®å¤ã value ã«æ ¼ç´ããã¦ãã¾ãã
ãã㧠(c1, c2)
ã®ãããªè¤åã¤ã³ããã¯ã¹ãèãã¦ã¿ã¾ããã¤ã¡ã¼ã¸ã¨ãã¦ã¯æ¬¡ã®ãããªæ§é ã«ãªãã¾ããä¾ãã°ãkey ã®ä¸ä½ 4 bytes ã c1
ã«å²ãå½ã¦ãä¸ä½ 4 bytes ã c2
ã«å²ãå½ã¦ãã¤ã¡ã¼ã¸ã§ãã
å³ãããããããã«ãc2 = 2
ã«å¯¾å¿ããã¤ã³ããã¯ã¹ã¬ã³ã¼ããæ¢ããã¨ãã¦ããc1, c2
ã®é çªã§ä¸¦ãã§ããã®ã§ãæ¨ã辿ããã¨ã§æ¢ããã¨ã¯ã§ãã¾ãããc1 = 4 AND c2 = 2
ã®ããã« c1
ã®æ¡ä»¶ãæå®ããããã¨ã§æ¨ã辿ããã¨ãã§ããããã«ãªãã¾ãã
ã¾ããc1 >= 2 AND c2 <= 4
ã®ãããªæ¡ä»¶ã®å ´åãc1 >= 2
ã®æ¡ä»¶ãæºããã¤ã³ããã¯ã¹ã¬ã³ã¼ãã¯æ¨ã辿ããã¨ã§æ¢ãã¾ããããããã®ã¤ã³ããã¯ã¹ã¬ã³ã¼ããæ´ã« c2 <= 4
ã®æ¡ä»¶ã§çµãè¾¼ãããã«æ¨ãå©ç¨ãããã¨ã¯ã§ãã¾ãããå
·ä½çã«ã¯ãå³ã®ä¾ã 㨠[7,5]
ãæ¡ä»¶ãæºãããªãã¤ã³ããã¯ã¹ã¬ã³ã¼ãã§ããããã®é£ã® [9,3]
ãæ¡ä»¶ãæºãããã©ããã¯ããããªãã§ããããçµå±ã®ã¨ãããc1 >= 2
ã®ã¤ã³ããã¯ã¹ã¬ã³ã¼ãå
¨ã¦ãèµ°æ»ããªãã¨ããã¾ããã
ãã£ã¦ãã¤ã³ããã¯ã¹ã¬ã³ã¼ãã®èµ°æ»ã®æ°ãæ¸ãã観ç¹ã§ã¯ c1 = 2 AND c2 <= 4
ã®ããã« c1
ã®æ¡ä»¶ãç価æ¯è¼ã«ãªãå ´åã«éã£ã¦ãè¤åã¤ã³ããã¯ã¹ã¨ãã¦ã®æå³ãæã¤ãã¨ã«ãªãã¾ãã*2
ãã®ãã¨ã«ã¤ãã¦ã¯ MySQL ã®ããã¥ã¡ã³ãã® 8.2.1.2 Range Optimization ã«ã次ã®ããã«è¨åããã¦ãã¾ãã
The optimizer attempts to use additional key parts to determine the interval as long as the comparison operator is =, <=>, or IS NULL. If the operator is >, <, >=, <=, !=, <>, BETWEEN, or LIKE, the optimizer uses it but considers no more key parts.
InnoDB ã«ããã B+ æ¨ã®å®è£ ã«ã¤ãã¦ç¥ãããæ¹ã¯æ¬¡ã®è¨äºã¨è¨åããã¦ããé¢é£è¨äºãèªãã¨ããªãç解ãæ·±ã¾ãã¨æãã¾ãã
B+Tree index structures in InnoDB â Jeremy Cole
ã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ã¨ã»ã«ã³ããªã¤ã³ããã¯ã¹
InnoDB ã®ä¸»ãã¼ã¯ã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ (clustered indexes) ã«ãªã£ã¦ãããB+ æ¨ã®èãã¼ãã«ã¬ã³ã¼ãã®å ¨ãã¼ã¿ãæ ¼ç´ããã¦ãã¾ãã ç¹å®ã®ã«ã©ã ã«å¼µãã¤ã³ããã¯ã¹ã¯ã»ã«ã³ããªã¤ã³ããã¯ã¹ã¨å¼ã°ããã»ã«ã³ããªã¤ã³ããã¯ã¹ã®èãã¼ãã«ã¯ä¸»ãã¼ãå¿ ãå«ã¾ãã¦ãã¾ãã
ã»ã«ã³ããªã¤ã³ããã¯ã¹ã使ã£ãæ¤ç´¢ã¯ãã¾ãã»ã«ã³ããªã¤ã³ããã¯ã¹ã® B+ æ¨ã辿ã£ã¦ä¸»ãã¼ãåå¾ãã次ã«ã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ã® B+ æ¨ã辿ã£ã¦ã¬ã³ã¼ããåå¾ãããã¨ã«ãªãã¾ãã
ã»ã«ã³ããªã¤ã³ããã¯ã¹ã«å¿ è¦ãªæ å ±ãå ¨ã¦æ ¼ç´ããã¦ããã°ãã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ã辿ãæé ãã¹ããããããã¨ãã§ããã®ã§é«éã§ãããã®ããã«ã¬ã³ã¼ããåå¾ããéã«ã»ã«ã³ããªã¤ã³ããã¯ã¹ã§å®çµããå ´åã®ãã¨ãã«ããªã³ã°ã¤ã³ããã¯ã¹ã¨å¼ã³ã¾ãã
MySQL ãã¬ã³ã¼ããåå¾ãã大ã¾ããªæé
MySQL ãã¬ã³ã¼ããåå¾ããéã®ä¸»è¦ãªç»å ´äººç©ã¨ãã¦ãexecutor*3 㨠storage engine (e.g. InnoDB) ããã¾ãã
storage engine ã InnoDB ã®å ´åã¯æ¬¡ã®ããã«ã¬ã³ã¼ããåå¾ãã¾ãã
- executor ã storage engine ã«ã¬ã³ã¼ããè¦æ±ãã
- storage engine (InnoDB) ã¯ã»ã«ã³ããªã¤ã³ããã¯ã¹ã®æ¨ã辿ããã¨ã§ãåå¾ãã¹ãã¬ã³ã¼ãã®ã¤ã³ããã¯ã¹ã«å«ã¾ãã¦ããã«ã©ã å¤ã¨ä¸»ãã¼ã®å¤ãå¾ã
- ã¤ã³ããã¯ã¹ã使ããªãå ´åã¯ã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ã«å«ã¾ãã¦ããå ¨ã¬ã³ã¼ãæ å ±ã executor ã«è¿ã
- storage engine 㯠2 ã§å¾ããã¼ã¿ã®ãã¡ãã¤ã³ããã¯ã¹ã«å«ã¾ãã¦ããã«ã©ã å¤ã®æ
å ±ã使ã£ã¦åå¾ãã¹ãã¬ã³ã¼ãããã£ã«ã¿ãªã³ã°ãã (Using index condition)
- ã¤ã³ããã¯ã¹ã«å«ã¾ãã¦ããæ å ±ã使ããªãå ´åã¯ã¹ããã
- storage engine 㯠3 ã§å¾ããã¼ã¿ã®ä¸»ãã¼æ
å ±ã使ã£ã¦ã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ããã¬ã³ã¼ããåå¾ãã
- SELECT ã§æå®ããã¦ããã«ã©ã ã WHERE ã§æå®ããã¦ããã«ã©ã ã®æ å ±ãå ¨ã¦ã¤ã³ããã¯ã¹ã«å«ã¾ãã¦ããå ´åã¯ã¹ããã (Using index)
- storage engine ã¯åå¾ããã¬ã³ã¼ãæ å ±ã executor ã«è¿ã
- executor 㯠storage engine ããã£ã«ã¿ãªã³ã°ã§ããªãã£ãã¬ã³ã¼ãããã£ã«ã¿ãªã³ã°ãã (Using where)
- storage engine å´ã§å ¨ã¦ãã£ã«ã¿ãªã³ã°ããã¦ããå ´åã¯ã¹ããã
ãéãªMySQLããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ãã¯ãã®è¾ºã®å 容ããããããã説æãã¦ããã®ã§ããã³ã¨ããªããã°èªããã¨ããå§ããã¾ãã
以ä¸ã®èª¬æã§ãExplain 㧠extra ã« Using index, Using index condition, Using where ãåºãå ´åã«ã©ã®ãããªå¦çãè¡ããã¦ãããã¤ã¡ã¼ã¸ãä»ãã¨æãã¾ãã
Using index condition ãåºãå ´å㯠ICP (Index Condition Pushdown) æé©åã¨å¼ã°ããMySQL 5.6 ããå°å
¥ããã¾ãããããã«ãã£ã¦ãã¯ã©ã¹ã¿åã¤ã³ããã¯ã¹ããåå¾ããã¬ã³ã¼ããæ¸ãã®ã§ãã®åé«éã«ãªãã¾ããc1 >= 2 AND c2 <= 4
ã®ãããªæ¡ä»¶ã®ããã« (c1, c2)
ã®è¤åã¤ã³ããã¯ã¹ãå¼µã£ã¦ãæå³ããªãã¨åè¿°ãã¾ããããICP ã®æ©æµãåãã¦ããã©ã¼ãã³ã¹ãæ¹åããå ´åãããã¾ãã
ã¤ã³ããã¯ã¹ãå¼µãä¸ã§ã®ãã¤ã³ã
ã¤ã³ããã¯ã¹ãå¼µãä¸ã§ã¯æ¬¡ã®ãããªå 容ããã¤ã³ãã«ãªãã¨æãã¾ãã
- ã¤ã³ããã¯ã¹ã§çµãè¾¼ããã¬ã³ã¼ãæ°ã大ãããï¼ï¼é¸ææ§ãé«ããï¼ï¼
WHERE c1 = 1 AND c2 = 2 AND c3 = 3 AND c4 = 4
ã¿ãããªæ¡ä»¶ãããããã¨ãã£ã¦ã(c1, c2, c3, c4)
ã®è¤åã¤ã³ããã¯ã¹ãå¿ è¦ã¨ã¯éããªãc1
ã§ååçµããããã®ã«ä»ã®ã«ã©ã ãã¤ã³ããã¯ã¹ã«å«ããã¨ã¤ã³ããã¯ã¹ãè¥å¤§åãã
- è¤åã¤ã³ããã¯ã¹ãå¼µãå ´å
- çµãè¾¼ããã¬ã³ã¼ãæ°ã®å¤§ããã«ã©ã ãå ã«ãã¦ãããï¼
- ç価æ¯è¼ããã«ã©ã ãå ã«ãªã£ã¦ãããï¼
- ã«ããªã³ã°ã¤ã³ããã¯ã¹ã®æ©æµãååã«åãããããï¼
- ICP ã®æ©æµãååã«åãããããï¼
- ã½ã¼ãã«ä½¿ããï¼*4
ä¸é©åãªã¤ã³ããã¯ã¹ã®ä¾
ããã¾ã§ã«èª¬æããå 容ãããã£ã¦ããã¨ã以ä¸ã«æããå 容ãä¸é©åãªã¤ã³ããã¯ã¹ã ã¨ãããã¯ãã§ãã
- ã¤ã³ããã¯ã¹ã®æåã®ã«ã©ã ã«ç¯å²æå®ãããè¤åã¤ã³ããã¯ã¹
- é¸ææ§ã®æªãã¤ã³ããã¯ã¹
- ä»ã®ã¤ã³ããã¯ã¹ã§ä»£æ¿ã§ããã¤ã³ããã¯ã¹
å ·ä½ä¾ãæããããã«ã次ã®ãããªãã¼ãã«ãæ±ããã¨ã«ãã¾ããååæ å ±ã管çãããã¼ãã«ã§ãç¾å¨ä»¥éã«æ²è¼ãããååã®æ å ±ãæ¥ã 追å ããã¦ããæ³å®ã§ãã
CREATE TABLE `products` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `shop_id` int(10) unsigned NOT NULL, -- ååãæ²è¼ãã¦ããåºèã® ID `name` varchar(255) NOT NULL, -- ååå `price` int(10) unsigned NOT NULL, -- ååã®ä¾¡æ ¼ `starts_at` datetime NOT NULL, -- ååã®æ²è¼éå§æ¥æ `ends_at` datetime NOT NULL, -- ååã®æ²è¼çµäºæ¥æ PRIMARY KEY (`id`) ) ENGINE=InnoDB
ããã§ã¯å ·ä½ä¾ãè¦ã¦ããã¾ãã
ã¤ã³ããã¯ã¹ã®æåã®ã«ã©ã ã«ç¯å²æå®ãããè¤åã¤ã³ããã¯ã¹
次ã®ã¤ã³ããã¯ã¹ãå®ç¾©ããã¦ããã¨ãã¾ãã
ALTER TABLE products ADD INDEX ix_ends_at_starts_at (ends_at, starts_at);
ããã¯ã次ã®ãããªã¯ã¨ãªã«å¯¾å¦ããããã«å®ç¾©ãããã¤ã³ããã¯ã¹ã§ãããends_at
åä¸ã®ã¤ã³ããã¯ã¹ãå¼µãã®ã¨ãã¾ãå¤ããã¾ããã*5
-- ç¾å¨æ²è¼ããã¦ããååãæ½åºãã SELECT * FROM products WHERE starts_at <= NOW() AND ends_at >= NOW();
ãã®çç±ã¯æ¬¡ã®ãã㪠B+ æ¨ãã¤ã¡ã¼ã¸ããã¨ããããããã§ãããã®æ¨ã¯ (c1, c2)
ã«å¯¾ãã¦æ§ç¯ããã B+ æ¨ã§ãããc1 >= 2 AND c2 <= 5
ã®ãããªæ¡ä»¶ã§ã¬ã³ã¼ããå¼ããã¨æã£ãå ´åã«ã¤ã³ããã¯ã¹ã¬ã³ã¼ããèµ°æ»ããæ°ãæ¸ãã¾ãããä¾ãã°ã[2,8]
ã®ã¤ã³ããã¯ã¹ã¬ã³ã¼ãã c2
ã®æ¡ä»¶ãæºããã¾ãããããã®é£ã® [3,1]
ã c2
ã®æ¡ä»¶ãæºãããã©ããã¯æ¨ã®æ§é ããå¤æã§ãããc1 >= 2
ã®ã¤ã³ããã¯ã¹ã¬ã³ã¼ããå
¨ã¦èµ°æ»ãããã¨ã«ãªãã¾ãã
MySQL 5.6 ã§ã¯åè¿°ãã ICP æé©åã¨ããä»çµã¿ãããã®ã§ãstarts_at >= NOW()
ã§ã®çµãè¾¼ã¿ã§åçã«ã¬ã³ã¼ããæ¸ãããã§ããã°ãICP ã®æ©æµãåããããããããã¾ããã
ICP ã®å¹æ㯠session status ã® Handler_read_next ã®å¤ãã©ãã ãå¤ããããè¦ã¦ã¿ãã®ãè¯ãã§ãããããã®å¤ãå°ãªãã»ã©ã¤ã³ããã¯ã¹ã¬ã³ã¼ãã®èµ°æ»ãå°ãªããã¨ãæå³ãã¾ãã
-- ICP æå¹ FLUSH STATUS; SET @@optimizer_switch = "index_condition_pushdown=on"; SELECT * FROM products WHERE starts_at <= NOW() AND ends_at >= NOW(); SHOW SESSION STATUS LIKE 'Handler%'; -- ICP ç¡å¹ FLUSH STATUS; SET @@optimizer_switch = "index_condition_pushdown=off"; SELECT * FROM products WHERE starts_at <= NOW() AND ends_at >= NOW(); SHOW SESSION STATUS LIKE 'Handler%';
ICP ã®å¹æãä½ãã¨å¤æããããix_ends_at_starts_at
ã¯åé¤ãã¦åä¸ã®ã¤ã³ããã¯ã¹ãå¼µãã¾ãããã
ALTER TABLE products DROP INDEX ix_ends_at_starts_at, ADD INDEX ix_ends_at (ends_at);
ä¼¼ããããªä¾ã¨ãã¦ã次ã®ãããªã¤ã³ããã¯ã¹ãèãã¾ãã
ALTER TABLE products ADD INDEX ix_ends_at_shop_id (ends_at, shop_id);
ããã¯ã次ã®ãããªã¯ã¨ãªã«å¯¾å¦ããããã«å®ç¾©ãããã¤ã³ããã¯ã¹ã§ãããåæ§ã« ends_at
åä¸ã®ã¤ã³ããã¯ã¹ãå¼µãã®ã¨ãã¾ãå¤ããã¾ããã
-- shop_id = 1234 ã®åºèã®ç¾å¨æ²è¼ãããååãæ½åºãã SELECT * FROM products WHERE shop_id = 1234 AND starts_at <= NOW() AND ends_at >= NOW();
shop_id
ã¯ç価æ¯è¼ã§ä½¿ãåæãªã®ã§ã(shop_id, ends_at)
ã®é çªã§ã¤ã³ããã¯ã¹ãå¼µããã¨ã§è¤åã¤ã³ããã¯ã¹ã¨ãã¦ã®æ©æµãå¾ããã¾ãã
ALTER TABLE products DROP INDEX ix_ends_at_shop_id, ADD INDEX ix_shop_id_ends_at (shop_id, ends_at);
é¸ææ§ã®æªãã¤ã³ããã¯ã¹
次ã®ã¤ã³ããã¯ã¹ãå®ç¾©ããã¦ããã¨ãã¾ãã
ALTER TABLE products ADD INDEX ix_shop_id_starts_at (shop_id, starts_at);
ããã¯ã次ã®ãããªã¯ã¨ãªã«å¯¾å¦ããããã«å®ç¾©ãããã¤ã³ããã¯ã¹ã§ãããé¸ææ§ã®è¦³ç¹ã§è¯ãããã¾ããã
-- shop_id = 1234 ã®åºèã®ç¾å¨æ²è¼ãããååãæ½åºãã SELECT * FROM products WHERE shop_id = 1234 AND starts_at <= NOW() AND ends_at >= NOW();
ix_shop_id_starts_at
ã®é¸ææ§ãè¯ããã©ããã¯ãã¼ãã«ã¨ã¯ã¨ãªã®ç¹æ§æ¬¡ç¬¬ã§ãããproducts
ãã¼ãã«ãç¾å¨ä»¥éã«æ²è¼ãããååãã追å ããããéå»ã«æ²è¼ããã¦ããååãæ®ãç¶ããã®ã§ããã°ãstarts_at <= NOW()
ã¨ããæ¡ä»¶ã¯è©²å½ã¬ã³ã¼ããæ¥ã
å¢ãã¦ããã¾ããä¸æ¹ã§ãends_at >= NOW()
ã¯ååã®å¢ãæ¹ãä¸å®ã§ããã°è©²å½ã¬ã³ã¼ãã®éã¯ä¸å®ã¨ã¿ãªãã¾ãã
ãã£ã¦ã(shop_id, ends_at)
ã«ã¤ã³ããã¯ã¹ãå¼µãã¹ãã§ãã
ALTER TABLE products DROP INDEX ix_shop_id_starts_at, ADD INDEX ix_shop_id_ends_at (shop_id, ends_at);
ä»ã®ã¤ã³ããã¯ã¹ã§ä»£æ¿ã§ããã¤ã³ããã¯ã¹
次ã®ã¤ã³ããã¯ã¹ãå®ç¾©ããã¦ããã¨ãã¾ãã
ALTER TABLE products ADD INDEX ix_shop_id (shop_id), ADD INDEX ix_shop_id_ends_at (shop_id, ends_at);
ããã¯æ¬¡ã®ãã㪠2 種é¡ã®ã¯ã¨ãªã«å¯¾å¦ããããã«å®ç¾©ãããã¤ã³ããã¯ã¹ã§ãããix_shop_id
ã¯åé·ã§ãã
-- shop_id = 1234 ã®åºèã«æ²è¼ããããã¨ããããã¾ãã¯æ²è¼ãããäºå®ã®ååãå ¨ã¦æ½åºãã SELECT * FROM products WHERE shop_id = 1234; -- shop_id = 1234 ã®åºèã®ç¾å¨æ²è¼ãããååãæ½åºãã SELECT * FROM products WHERE shop_id = 1234 AND starts_at <= NOW() AND ends_at >= NOW();
shop_id
ã§ã®çµãè¾¼ã¿ã«ç¹åããã¤ã³ããã¯ã¹ã¨ã㦠ix_shop_id
ãå°å
¥ããã¨æããã¾ããã次㮠2 ã¤ã®æ¨ãè¦ãã° ix_shop_id_ends_at
ã ix_shop_id
ã®å½¹å²ãå
å«ãã¦ãããã¨ã¯ä¸ç®çç¶ã§ãã
ãã£ã¦ãix_shop_id
ã¯åé¤ãã¹ãã§ãã
ALTER TABLE products DROP INDEX ix_shop_id;
æå¾ã«
以ä¸ãMySQL (InnoDB) ã®ã¤ã³ããã¯ã¹ã«ã¤ãã¦ç°¡åã«è§£èª¬ãã¾ãããInnoDB ã«ã¤ãã¦å®ç§ã«ç解ãããã¨æãã¨è¨å¤§ãªç¥èãå¿ è¦ã§ãããããããåç´ãªç¨éã§ã¤ã³ããã¯ã¹ãå¼µãã ãã§ããã°ãå¿ è¦ã¨ãããç¥èã¯ã»ãã®å°ãã§ãããã¨ããããã¨æãã¾ãã æ¬ã¨ã³ããªã¼ã«ãã£ã¦ãä¸ã®ä¸ããä¸é©åãªã¤ã³ããã¯ã¹ã ããã®ãã¼ãã«ãå°ãã§ããªããªãã°å¹¸ãã§ãã
*1:次æ°ã®è§£éã¯æç®ã«ãã£ã¦ç°ãªãã®ã§ã2017 å¹´ 4 æ 17 æ¥æç¹ã® Wikipedia ã«åããã¦ãã¾ã
*2:å¾è¿°ãã ICP ãå¹æãçºæ®ããå ´åã¯ãã®éãã§ã¯ããã¾ãã
*3:executor ã mysql server ã¨è¡¨ç¾ãã¦ããè¨äºãè¦ããããã¨ãããã¾ãããsql_executor.cc ã«å®è£ ããã¦ããã®ã§ executor ã¨ãã表ç¾ã®æ¹ãé©åã ã¨æãã¾ã
*4:æ¬ã¨ã³ããªã§ã¯ã½ã¼ãã«ã¯è§¦ããªãã®ã§ãèå³ã®ããæ¹ã¯ãæ¼¢(ãªãã³)ã®ã³ã³ãã¥ã¼ã¿é: Using filesortããåç §ããã¨è¯ãã¨æãã¾ã
*5:Explain ã® key_len çã«ã¯ starts_at ã使ãããããã«è¦ããã®ã§ãã½ã¼ã¹ã³ã¼ããèªãã§ãã®çç±ã調ã¹ããã¨åã ããæã£ã¦ã¾ãããæªã ã«èª¿æ»ã§ãã¦ã¾ããâ¦