以前一直以为在order by的字段上加上索引就行了,网上搜也是,实际上使用的时候在查询中如果使用了ORDER BY 语句,如果在select中有未加入索引的字段,使用order by以后就不会走索引,而会进行全表扫描。
单表的话可以在from字段后加入FORCE INDEX(key)字段,就能强制使用索引。
使用前
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | t_sms | ALL | NULL | NULL | NULL | NULL | 107 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
type时all,代表全表扫描
extra使用的是Using filesort。文件排序。这项效率非常低
使用后
+----+-------------+-------+-------+---------------+-----------------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-----------------+---------+------+------+-------+
| 1 | SIMPLE | t_sms | index | NULL | sms_create_time | 9 | NULL | 10 | |
+----+-------------+-------+-------+---------------+-----------------+---------+------+------+-------+
使用后type就是index了,说明走了索引,并且extra没有值,说明文件顺序和order by字段顺序一直,不需要额外的操作