0

私が得た (私が考えた) のは、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 の知識を少しブラッシュアップする必要があります)。このような単純なクエリに一時テーブルを使用している理由を知っている人はいますか?

4

0 に答える 0