内连接,嵌套查询和自然连接之间的性能明智区别?

时间:2015-07-26 12:55:02

标签: mysql inner-join

我在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;

所有查询都给了我相同的结果。

哪个查询最快最有效(嵌套查询或内连接或自然连接)以及为什么要在嵌套查询和内连接中进行特殊处理?

我们应该选择查询什么做法?

最后两个查询之间的区别是什么?

2 个答案:

答案 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。不幸的是,它不使用为表定义的外键信息。相反,它依赖于具有相同名称的列。即使我将我的表设计为具有相同名称的主键和外键,我永远不会使用自然连接。根据命名约定意味着sizepriceCreatedAt等列会导致join执行除我想要的操作之外的其他操作。始终使用onusing