Mysql - 使用临时;使用filesort

时间:2016-05-29 14:40:44

标签: mysql join explain

我有两张这样的表

CREATE TABLE `vendors` (
  vid int(10) unsigned NOT NULL AUTO_INCREMENT,
  updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (vid),
  key(updated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `products` (
  vid int(10) unsigned NOT NULL default 0,
  pid int unsigned default 0,
  flag int(11) unsigned DEFAULT '0',
  PRIMARY KEY (vid),
  KEY (pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是一个简单的查询

> explain select vendors.vid, pid from products, vendors where pid=1 and vendors.vid=products.vid order by updated;
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+
| id   | select_type | table    | type   | possible_keys | key     | key_len | ref                 | rows | Extra                                        |
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+
|    1 | SIMPLE      | products | ref    | PRIMARY,pid   | pid     | 5       | const               |    1 | Using index; Using temporary; Using filesort |
|    1 | SIMPLE      | vendors  | eq_ref | PRIMARY       | PRIMARY | 4       | social.products.vid |    1 |                                              |
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+

我想知道为什么mysql需要使用临时表和filesort来进行这样一个简单的查询。如您所见,ORDER BY字段具有索引。

mysql在这里小提琴:http://sqlfiddle.com/#!9/3d9be/30

1 个答案:

答案 0 :(得分:0)

在这种情况下,这将是最佳查询,并不总是必须转到索引以获得最快结果。当记录计数增加时,优化器可以选择使用索引。您可以尝试插入10,000个虚拟记录,看看是否是这种情况。

如果我在这里翻转条件,你会发现它将使用索引,因为我在查询后面提供了where条件连接的表。我们需要在连接完成后查看表产品中的记录,因此实质上我已经使其工作更难,因此使用了索引。它仍然会在同一时间运行。您可以尝试将2个查询彼此对齐,看看会发生什么。这是:

EXPLAIN
SELECT vendors.vid, products.pid 
FROM vendors 
INNER JOIN products ON vendors.vid = products.vid
WHERE pid = 1
ORDER BY vendors.updated DESC

您可以在此处找到详细说明:Fix Using where; Using temporary; Using filesort