私が得た (私が考えた) のは、MySQL データベースに対する非常に単純なクエリですが、使用explain
すると、クエリが一時テーブルを使用していることがわかります。選択と結合の順序を変更しようとしましたが、役に立ちませんでした。テーブルを最も単純なものに減らしました (テーブルの複雑さに問題があるかどうかを確認するためですが、まだ問題があります)。私は2つの基本的なテーブルで試しました.1つは「名前」フィールドで、もう1つはそのテーブルへの外部キー参照です:
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 の知識を少しブラッシュアップする必要があります)。このような単純なクエリに一時テーブルを使用している理由を知っている人はいますか?