1

我有两张桌子:

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.id和值items.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必须使用这个键并且类型不能是 ALL。怎么了?

请帮我!

谢谢!

4

1 回答 1

1

手册中所述

当 MySQL 使用表扫描来解析查询时,输出EXPLAIN显示在 type 列中。ALL这通常发生在以下情况下:

[...]

  • 该表是如此之小,以至于执行表扫描比费心查找键要快。这对于少于 10 行且行长度较短的表很常见。在这种情况下不要担心。
于 2012-05-31T12:37:55.897 回答