我有(我认为)是对 MySQL 数据库的一个非常简单的查询,但使用explain
表明该查询正在使用临时表。我试过改变选择和加入的顺序,但无济于事。我已将表格简化为最简单的表格(看看这是否是我的表格复杂性的问题,但我仍然有问题)。我已经用两个基本表进行了尝试,一个带有“名称”字段,另一个带有指向该表的外键引用:
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 知识需要稍微提高一下)。任何人都知道为什么它使用临时表进行如此简单的查询?