我有两张这样的表
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
答案 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