2016-05-29 5 views
2

を使用すると、私はこのような二つのテーブルMysql - 一時的な使用。 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; 

を持っているこれは、mysqlは、このような単純なクエリのために一時テーブルとfilesortレコードを使用する必要がなぜ私が疑問に思って単純なクエリ

> 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 |            | 
+------+-------------+----------+--------+---------------+---------+---------+---------------------+------+----------------------------------------------+ 

です。あなたが見ることができるように、ORDER BYフィールドはインデックスを持っています。ここ

MySQLのフィドル:http://sqlfiddle.com/#!9/3d9be/30

+0

:あなたがここに詳細な説明を見つけることができます

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

。結果セットにいくつの行があると思われますか? 100行のソートを心配しないでください。 –

答えて

0

その場合には、最適なクエリになり、常に最速の結果をインデックスに行く必要はありません。オプティマイザは、レコード数が増加したときにインデックスを使用することを選択できます。 10,000個のダミーレコードを挿入し、これが正しいかどうかを調べることができます。

ここで条件を反転すると、クエリの後半でwhere条件が結合されているテーブルが指定されているため、インデックスを使用することがわかります。結合が行われた後のテーブル製品のレコードを調べる必要があるので、本質的にはそれをもっと難しくしているので、インデックスが使用されています。それはまだ同じ時間に実行されます。 2つのクエリをお互いに照らし合わせてみると、何が起こるかを知ることができます。ここでは、次のとおりです。おそらく、修正するためには何もありませんFix Using where; Using temporary; Using filesort

+0

クエリの実行計画が同じである必要があります。 MySQLにベンダーのテーブルを最初に読み込ませる場合は、STRAIGHT_JOINまたはFORCE INDEX(更新済み)を使用する必要があります。 –

関連する問題