[英]Mysql - Using temporary; Using filesort
我有兩個這樣的桌子
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需要使用臨時表和文件排序進行這樣的簡單查詢。 如您所見,ORDER BY字段具有索引。
在這種情況下,這將是最佳查詢,而不必總是去索引以獲得最快的結果。 當記錄計數增加時,優化器可以選擇使用索引。 您可以嘗試插入10,000個虛擬記錄,看看是否是這種情況。
如果在這里翻轉條件,您會發現它將使用索引,因為稍后在查詢中提供了連接條件所在的表。 進行連接后,我們需要查看表產品中的記錄,因此從本質上講,我已經使工作更加艱苦,因此使用了索引。 它仍然會同時運行。 您可以嘗試使兩個查詢相互競爭,以查看會發生什么。 這里是:
EXPLAIN
SELECT vendors.vid, products.pid
FROM vendors
INNER JOIN products ON vendors.vid = products.vid
WHERE pid = 1
ORDER BY vendors.updated DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.