我(我认为)是对MySQL数据库的一个非常简单的查询,但使用explain
表明查询正在使用临时表。我已经尝试改变选择和连接的顺序,但无济于事。我已经将表格简化为最简单的(看看它是否是我表格复杂性的问题,但我仍然有问题)。我已经尝试了两个基本表,一个带有“name”字段,另一个带有外键引用回到该表:
a:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(128) | NO | MUL | NULL | |
+-------+--------------+------+-----+---------+----------------+
b:
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| a_id | int(11) | NO | MUL | NULL | |
+-------+---------+------+-----+---------+----------------+
这是我的疑问:
SELECT a.id, a.name FROM a JOIN b ON a.id = b.a_id ORDER BY a.name;
我认为这很简单......只是a
中所有记录的列表,其中b
的记录按名称排序。唉explain
说:
+----+-------------+-------+--------+---------------+---------+---------+--------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+--------+------+----------------------------------------------+
| 1 | SIMPLE | b | index | a_id | a_id | 4 | NULL | 2 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | a | eq_ref | PRIMARY | PRIMARY | 4 | b.a_id | 1 | |
+----+-------------+-------+--------+---------------+---------+---------+--------+------+----------------------------------------------+
看起来它应该使用b
表上的密钥,但由于某种原因它不是。我觉得我缺少一些基本的东西(或者我的RDBMS知识需要稍微刷新)。任何想法为什么它使用临时表进行这样一个简单的查询?