1

私は2つのテーブルを持っています:

CREATE TABLE IF NOT EXISTS treaties(
id INT NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
PRIMARY KEY(id)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS items(
id INT NOT NULL AUTO_INCREMENT,
treaty INT NOT NULL,
item varchar(20),
PRIMARY KEY(id),
FOREIGN KEY (treaty) REFERENCES treaties(id)
      ON UPDATE RESTRICT
      ON DELETE RESTRICT
)ENGINE=InnoDB;

その後、各テーブルに数行を挿入しましたが、値treaties.iditems.treaty同じでした。私が走るとき

EXPLAIN SELECT * 
FROM `items` 
JOIN `treaties` ON `items`.`treaty` = `treaties`.`id` 
WHERE 1

私が得ました:

id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra
1  | SIMPLE      | treaties| ALL  | PRIMARY       | NULL|   NULL  | NULL|   3  |
1  | SIMPLE      | items   | ALL  | treaty        | NULL|   NULL  | NULL|   4  | Using where; Using join buffer

私は、間に外部キーがitems.treatyあり、treaties.idこのキーを使用する必要があり、タイプがすべてであってはならないと考えました。なにが問題ですか?

私を助けてください!

ありがとうございました!

4

1 に答える 1

1

マニュアルで説明されているように:

MySQLがテーブルスキャンを使用してクエリを解決すると、からの出力がtype列にEXPLAIN表示されます。ALLこれは通常、次の条件下で発生します。

[...]

  • テーブルは非常に小さいため、キールックアップを気にするよりもテーブルスキャンを実行する方が高速です。これは、行が10行未満で、行の長さが短いテーブルで一般的です。この場合は心配しないでください。
于 2012-05-31T12:37:55.897 に答える