0

我有(我认为)是对 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 知识需要稍微提高一下)。任何人都知道为什么它使用临时表进行如此简单的查询?

4

0 回答 0