我有两张桌子:
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
之间有外键,则必须使用此密钥,并且type不能为ALL。
有什么问题?
拜托,帮助我!
谢谢!
答案 0 :(得分:1)
如the manual中所述:
当MySQL使用表扫描来解析查询时,
EXPLAIN
的输出在类型列中显示ALL
。这通常在以下条件下发生:[...]
- 该表非常小,执行表扫描比使用键查找更麻烦。这对于行少于10行且行长度较短的表来说很常见。在这种情况下不要担心。