-
1.如果order by子句中的col都是来自于第一张表(但不满足索引排序的条件),那么mysql在关联处理第一个表时就会进行文件的排序。那么我们在explain的extra字段中就会看到useing filesort
mysql> explain SELECT payment.id,payment.money,payment.c_time,payment.card_type,b_member_card.active_time,b_users.name,b_users.tel,zone.zone_name,admin.name as admin_name,admin.role_id,b_card_info.card_name as ccname FROM `payment` LEFT JOIN b_member_card ON b_member_card.payid=payment.id LEFT JOIN b_users ON payment.xdy_id=b_users.uid LEFT JOIN zone ON payment.zone_id=zone.zone_id LEFT JOIN admin ON payment.sale_id=admin.id LEFT JOIN b_card_info ON payment.vip_card = b_card_info.id WHERE ( `sale_id` IN ('39','110','159','311','349','353','362','432','449','450','489','501','533','562') ) AND ( `payed` = 2 ) ORDER BY id,money desc LIMIT 0,10;
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+-----------------------------+
| 1 | SIMPLE | payment | ALL | NULL | NULL | NULL | NULL | 2965 | Using where; Using filesort |
| 1 | SIMPLE | b_member_card | ref | payid | payid | 5 | interface_hd_com0624.payment.id | 309 | |
| 1 | SIMPLE | b_users | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.xdy_id | 1 | |
| 1 | SIMPLE | zone | eq_ref | PRIMARY | PRIMARY | 3 | interface_hd_com0624.payment.zone_id | 1 | |
| 1 | SIMPLE | admin | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.sale_id | 1 | |
| 1 | SIMPLE | b_card_info | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.vip_card | 1 | |
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+-----------------------------+
2,除了上面的情况外,explain的extra字段都会看到use tempory;using filesort的情况
mysql> explain SELECT payment.id,payment.money,payment.c_time,payment.card_type,b_member_card.active_time,b_users.name,b_users.tel,zone.zone_name,admin.name as admin_name,admin.role_id,b_card_info.card_name as ccname FROM `payment` LEFT JOIN b_member_card ON b_member_card.payid=payment.id LEFT JOIN b_users ON payment.xdy_id=b_users.uid LEFT JOIN zone ON payment.zone_id=zone.zone_id LEFT JOIN admin ON payment.sale_id=admin.id LEFT JOIN b_card_info ON payment.vip_card = b_card_info.id WHERE ( `sale_id` IN ('39','110','159','311','349','353','362','432','449','450','489','501','533','562') ) AND ( `payed` = 2 ) ORDER BY id,money,b_users.name desc LIMIT 0,10;
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | payment | ALL | NULL | NULL | NULL | NULL | 2965 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | b_member_card | ref | payid | payid | 5 | interface_hd_com0624.payment.id | 309 | |
| 1 | SIMPLE | b_users | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.xdy_id | 1 | |
| 1 | SIMPLE | zone | eq_ref | PRIMARY | PRIMARY | 3 | interface_hd_com0624.payment.zone_id | 1 | |
| 1 | SIMPLE | admin | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.sale_id | 1 | |
| 1 | SIMPLE | b_card_info | eq_ref | PRIMARY | PRIMARY | 4 | interface_hd_com0624.payment.vip_card | 1 | |
+----+-------------+---------------+--------+---------------+---------+---------+---------------------------------------+------+----------------------------------------------+
6 rows in set (0.00 sec)