MySQL简单连接使用临时表

时间:2013-02-14 10:01:47

标签: mysql sql query-optimization

我(我认为)是对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知识需要稍微刷新)。任何想法为什么它使用临时表进行这样一个简单的查询?

0 个答案:

没有答案