ç¨ExplainåæSQLè¯å¥çæ¶åï¼ç»å¸¸åç°æçè¯å¥å¨Extraåä¼åºç°Using filesortï¼æ ¹æ®MySQL宿¹ææ¡£å¯¹ä»çæè¿°ï¼
å¼ç¨ MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause.
䏿æåä¸ç¿»è¯çå¾å«æï¼
å¼ç¨ âMysqléè¦é¢å¤ç䏿¬¡ä¼ éï¼ä»¥æ¾åºå¦ä½ææåºé¡ºåºæ£ç´¢è¡ï¼éè¿æ ¹æ®èæ¥ç±»åæµè§ææè¡å¹¶ä¸ºææå¹é whereåå¥çè¡ä¿åæåºå ³é®ååè¡çæéæ¥å®ææåºï¼ç¶åå ³é®å被æåºï¼å¹¶ææåºé¡ºåºæ£ç´¢è¡ãâ
æ»çæ¥è¯´ï¼Using filesort æ¯Mysqléä¸ç§é度æ¯è¾æ ¢çå¤é¨æåºï¼å¦æè½é¿å æ¯æå¥½çäºï¼å¾å¤æ¶åï¼æä»¬å¯ä»¥éè¿ä¼åç´¢å¼æ¥å°½éé¿å åºç°Using filesortï¼ä»èæé«é度ã
è¿é举个ç®åçä¾åï¼
CREATE TABLE `testing` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `room_number` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `room_number` (`room_number`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
å个åå¨è¿ç¨askwanï¼æå ¥10䏿¡æµè¯æ°æ®
mysql> DELIMITER $$
Â
DROP PROCEDURE IF EXISTS `askwan`.`askwan` CREATEPROCEDUREâaskwanâ.âaskwanâ()BEGINDECLAREvINTDEFAULT1;WHILEv<100000;DOINSERTINTOtestingVALUES(v,v);SETv=v+1;ENDWHILE;END
Â
mysql> DELIMITER ;
Â
mysql> CALL askwan();
Query OK, 1 row affected (13.21 sec)
OK,æ°æ®åå¤å¥½äºï¼å¼å§è¯éªã
ç±ä¸é¢ä¾åä¸å»ºç«ç表信æ¯ï¼æå·²ç»å»ºç«äºä¸¤ä¸ªç´¢å¼ï¼ä¸ä¸ªä¸»é®idï¼ä¸ä¸ªroom_numberåç´¢å¼
é£ç°å¨æ¥ç䏿¡SQL,
SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
åæä¸ä¸
mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
| id | select_type | table  | type | possible_keys | key        | key_len | ref  | rows | Extra                      |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | testing | ref  | room_number  | room_number | 4      | const |    1 | Using where; Using filesort |
+----+-------------+---------+------+---------------+-------------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)
åºç°äºUsing filesortï¼å¹¶ä¸ç¨å°äºroom_numberè¿åç´¢å¼ï¼ä½æ¯ï¼å¨è¿éç¨å°çç´¢å¼æ¯é对WHEREåé¢çroom_numberæ¡ä»¶çï¼èæåé¢çæåºæ¯æ ¹æ®idæ¥çï¼è¿å°±æ¯æåä¸è¯´çï¼âé¢å¤ç䏿¬¡æåºâï¼ï¼äºæ¯å°±ä¼åºç°Using filesortï¼æ ¹æ®æä»¥ååè¿çä¸æç« ï¼æå建ç«ä¸ä¸ªèåç´¢å¼ room_number_id
alter table testing add index room_number_id(room_number,id);
卿¥åæä¸ä¸
mysql> EXPLAIN SELECT id FROM testing WHERE room_number=1000 ORDER BY id ;
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
| id | select_type | table  | type | possible_keys              | key            | key_len | ref  | rows | Extra                    |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | testing | ref  | room_number,room_number_id | room_number_id | 4      | const |    1 | Using where;  |
+----+-------------+---------+------+----------------------------+----------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
ç°å¨Using filesortä¸è§äºã
æ»ç»ä¸ä¸ï¼Â Â
  1.ä¸è¬æorder byè¯å¥ï¼å¨ç´¢å¼å å¾ä¸å½çæ åµä¸ï¼é½æå¯è½åºç°Using filesortï¼è¿æ¶åå°±è¦å¯¹SQLè¯å¥åç´¢å¼è¿è¡ä¼åäºï¼ä½æ¯ï¼å¹¶ä¸æ¯è¯´åºç°Using filesortå°±æ¯ä¸ªä¸¥éçé®é¢ï¼ä¸æ¯è¿æ ·çï¼æ¤æ¬¡ä¸¾çä¾åæ¯è¾æç«¯ï¼å ä¹ä¸å¤ªå¯è½åºç°è¿ä¹å»ççæ¥è¯¢ï¼ä¼ååä¸ä¼åï¼è¦ç宿¯ä¸æ¯å½±åäºä¸å¡æ§è½ã
  2. ä»ä¸é¢å¯ä»¥çå°èåç´¢å¼ï¼ä¹å¯ä»¥å«å¤åç´¢å¼ï¼å½¢å¦ key ('A1','A2','A3' ,'A4')ççï¼æåºçæè·¯ä¸è¬æ¯ï¼å æç §A1æ¥æåºï¼A1ç¸åï¼ç¶åæç §A2æåºï¼ä»¥æ¤ç±»æ¨ï¼è¿æ ·å¯¹äºï¼A1ï¼,(A1,A2),(A1,A2,A3)çç´¢å¼é½æ¯ææçï¼ä½æ¯å¯¹äºï¼A2,A3ï¼è¿æ ·çç´¢å¼å°±æ æäºã
éè¦äºè§£MySQL çç¹æ§:
- 䏿¡ SQL è¯å¥åªè½ä½¿ç¨ 1 ä¸ªç´¢å¼ (5.0-)ï¼MySQL æ ¹æ®è¡¨çç¶æï¼éæ©ä¸ä¸ªå®è®¤ä¸ºæå¥½çç´¢å¼ç¨äºä¼åæ¥è¯¢
- èåç´¢å¼ï¼åªè½æä»å·¦å°å³ç顺åºä¾æ¬¡ä½¿ç¨
- ä»ä¸è¾¹å¯ä»¥çå°ç»åç´¢å¼ï¼ä¹å¯ä»¥å«å¤åç´¢å¼ï¼å½¢å¦ key ('B1','B2','B3' ,'B4')ççï¼æåºçæè·¯é常为ï¼å æç §B1æ¥æåºï¼B1ç¸åï¼ç¶åæç §B2æåºï¼ä»¥æ¤ç±»æ¨ï¼è¿æ ·å¯¹äºï¼B1ï¼,(B1,B2), (B1,B2,B3)çç´¢å¼é½æ¯ææçï¼å¯æ¯å¯¹äºï¼B2,B3ï¼è¿æ ·çç´¢å¼å°±æ æäºã
æ ¹æ®è¿ä¸ªç¹æ§å°±å¯ä»¥è§£å³é®é¢:
user_id å item_id æ¯ 2 个索å¼ï¼æçè¯å¥ä¸ï¼MySQL éæ©äº user_idï¼é£ä¹ item_id çç´¢å¼æ²¡æèµ·å°ä»»ä½ç¨å¤ï¼æä»¥ï¼å½æè¦æåºçæ¶åï¼ç±äºè®°å½æ°è¾å¤ï¼å åä¸çæåº buffer 满äºï¼åªè½Â Using filesort è¿è¡å¤é¨æåºï¼å æ¤æ¯æ¬¡æ¥è¯¢è¦ä»ç£ç读åå å M çæ°æ®ï¼å¤ªæ ¢äºã
ä¿®æ¹è¡¨ç»æï¼å é¤ user_id å item_id ç INDEX ç´¢å¼ï¼å»ºç«ä¸ä¸ªå为 user_item çèå UNIQUE ç´¢å¼ï¼é¡ºåºæ¯å user_id å item_idï¼å EXPLAINï¼è¿ååªæÂ Using where äºã
Â
Â