我在MySQL 5.6中使用以下代码创建了两个表
create table color(color_id int auto_increment primary key,
color varchar(10));
和
create table flower(id int auto_increment primary key,
name varchar(20),
color_id int,
constraint fk_color foreign key references color(color_id));
然后我插入一些颜色的行,然后插入花朵。
然后我查询了
1)
select flower.name, color.color from flower, color where
flower.color_id=color.color_id;
2)
select name,(select color from color where color_id=flower.color_id) color from flower;
3)
select flower.name, color.color from color natural join flower;
4)
select flower.name, color.color from flower natural join color;
所有查询都给了我相同的结果。
哪个查询最快最有效(嵌套查询或内连接或自然连接)以及为什么要在嵌套查询和内连接中进行特殊处理?
我们应该选择查询什么做法?
最后两个查询之间的区别是什么?
答案 0 :(得分:0)
保持简单。不要想它。说出你的意思,并说出你说的话。更简单通常更快。使用主键和外键。使用索引。
答案 1 :(得分:0)
您的查询不相同。表达你想要的东西的正确方法是:
select flower.name, color.color
from flower join
color
on flower.color_id = color.color_id;
或:
select flower.name, color.color
from flower join
color
using (color_id);
并且,对于此查询,您需要color(color_id)
上的索引以获得最佳性能。 flower(color_id)
上的索引也可以,但有点违反直觉。
以下是每个版本的评论(我编号)。
第一种使用古老的join
语法,这种语法已经过时了20多年。是时候继续前进并开始使用更现代的表格,包括明确的join
。但是,与等效inner join
相比,这对性能没有任何影响。
第二个真的是left outer join
。这使用相关子查询,在某些情况下可能是最好的方法。在这种情况下,它应具有相同的性能,但优化的选择较少。
第三和第四是等效的。感谢您使用现代join
语法。既然我已经说过了,那就避免natural join
。不幸的是,它不使用为表定义的外键信息。相反,它依赖于具有相同名称的列。即使我将我的表设计为具有相同名称的主键和外键,我永远不会使用自然连接。根据命名约定意味着size
或price
或CreatedAt
等列会导致join
执行除我想要的操作之外的其他操作。始终使用on
或using
。