MySQL多表联合查询效率的详细分析与优化

MySQL多表联合查询效率的详细分析与优化
1。多表连接类型

1。MySQL中的笛卡尔乘积(交叉连接)可以是交叉连接或省略交叉、连接或使用,作为:
SELECT * FROM表1交叉连接表
SELECT * FROM表1和表
SELECT * FROM表1,表2
因为它的返回结果是连接的两个数据表的乘积,所以在有、使用或使用条件时一般不推荐,因为当数据项太多时,它们将非常慢。

2、内部连接内部连接。我们称MySQL中的内部连接等价连接,也就是说,我们需要指定等价的连接条件。在MySQL,跨内加入分区together.join_table:table_reference { }内交叉加入table_factor { } | join_condition

3的外部连接。MySQL分为左外部连接和右连接。也就是说,除了返回符合连接条件的结果外,它还返回到左表(左连接)或右表(右连接)不符合连接条件的结果,相应地使用空对应。

实例uff1a

用户表:

我的名字|



1 | libk

2 | zyfon

3 |道道

user_action表:

user_id行动|

———

1 |跳

1 |踢

1 |跳

2 |运行

4 |游泳

Sql:
从用户中选择ID、名称、动作
左连接在u.id = a.user_id user_action
结果:

我的名字| |行动

---- ----—

1 | libk |跳1。

1 | libk |踢2

1 | libk |跳3

2 | zyfon |运行。

3 |道道|空。

分析uff1a

注意,有一个user_id = 4,在user_action行动=游泳记录,但没有结果,

和ID = 3和名称=在用户表中的用户user_action道道没有相应的记录,但他们出现在结果集

因为现在是左联接,所以所有的工作都是基于左边的。

结果1, 2, 3和4都在左、右表,5在左表,不在右表上。

工作原理uff1a

从左表中读取一个,并选择与右表记录匹配的所有右表记录(n条),以形成n个记录(包括重复行,如结果1和结果3)。如果没有与右边的条件匹配的表,则连接的字段为空,然后读下一个。

延伸:

我们可以使用正确的表而不用匹配来显示null规则,找出左边表上的所有记录,而不是在右边表上,并注意要确定的列必须声明为null。

如:

Sql:
从用户中选择ID、名称、动作
左连接在u.id = a.user_id user_action
在a.user_id是空的
小心:

1。列值是NULL,应该使用NULL,而不是=空。

2。的a.user_id柱必须声明为这里不空。

结果:以上SQL

我的名字| |行动

---- ----

3 |道道|空

----……----……----—

一般使用:

A.左{ }连接:

除了返回符合连接条件的结果外,还需要显示不符合左表中连接条件的数据列,相对于空对应。

复制代码代码如下:选择column_name从表1左{外}加入表在表1.柱= table2.column

B.右{ }联接:

右类似于左连接,它只显示符合连接条件的数据,也需要显示不符合右表中连接条件的数据列,并相应地使用空对应。

复制代码代码如下:选择column_name从表1右{外}加入表在表1.柱= table2.column
提示:

1。在a.c1 = b.c1等于使用(C1)

2。内部连接和(逗号)在语义上是等价的。

三.当MySQL从一个表中检索信息时,您可以提示它选择的索引。

如果解释说明MySQL在可能的索引列表中使用了错误的索引,这个特性将非常有用。

通过指定使用索引(key_list),你可以告诉MySQL的使用可能的指标最合适的索引查找表中的记录行。

可选的两个可选的句法忽视指数(key_list)可以用来告诉MySQL特定的指标是没有用的。如:
MySQL > SELECT * FROM表使用索引(KEY1、KEY2)
key1 = 1 = 2 = 3,KEY3键->;
MySQL >选择*从表1忽略指数(KEY3)
key1 = 1 = 2 = 3,KEY3键->;
2的制约因素。表连接

添加显示条件

1。WHERE子句

MySQL >

复制代码代码如下:SELECT * FROM表1,表2,表1。ID = table2.id;

2。在

MySQL >

复制代码代码如下:SELECT * FROM表1左连接表在表1. id = table2.id;
SELECT * FROM表1左连接表在表1. id = table2.id

左表表ID = table3.id加入;
3。使用子句,如果两个连接表连接的两个列具有相同的名称,则可以使用

例如:

从左连接中选择(使用)
两个以上的表连接的例子:

MySQL >
选择艺术家。艺术家,cds.title,genres.genre

从CD

左连接类型N cds.genreid = genres.genreid

左连接cds.artistid = artists.artistid艺术家;
或MySQL >
选择艺术家。艺术家,cds.title,genres.genre

从CD

左连接cds.genreid = genres.genreid流派

左连接艺术家->在cds.artistid = artists.artistid

在(genres.genre =打开引擎);
中国

MySQL中需要注意的另一个地方涉及多个表查询,根据查询需要找出哪个连接更有效。

1。交叉连接(笛卡儿积)或{ }内加入|交叉连接

2。左{ }加入左外部连接或连接右}外部联接,该连接指定位置、开始、使用的连接条件。

三.如何优化左连接和右连接

在MySQL中,加入B的左join_condition执行过程如下:

1)。根据表A和A的所有表来设置表B。

2)。根据左连接条件中使用的所有表(除b)设置表A。

3)。左连接条件用于决定如何从表B中搜索行(换句话说,不要使用WHERE子句中的任何条件)。

4)。所有的标准连接都可以优化,只有一个表异常只能从它所依赖的所有表中读取。如果存在循环依赖,MySQL提示符就有错误。

5)。实现所有标准的最优化。

6)。如果A中的一行匹配WHERE子句,但B中没有一个匹配条件,则生成另一行B,所有这些行都被设置为null。

7)如果你使用左连接发现不在表中的一些列的存在,并进行了以下试验:在col_name部分为空col_name,这是一个空的不列声明,停止MySQL找到匹配的左连接条件(特定的关键字组合搜索后)其他线。

右连接的执行类似于左连接,它与表的作用相反。

加入优化计算的顺序表应加入。强制表的阅读顺序左连接和straight_join可以帮助加入优化工作得更快,因为查表交流少。请注意,如果以下类型的查询,MySQL是完全扫描B,因为左连接迫使它读过D:
*选择
从A,B和C(左上c.key = a)左连接D
在b.key = d.key;
在这种情况下,在a的逆序中,b被列在from子句中:
*选择
B、左加入C(c.key = a)左连接D
在b.key = d.key;
MySQL可以执行下面的左联接优化:如果生成空行,则WHERE条件总是错误的,左连接成为一个公共连接。

例如,在下面的查询,如果t2.column1是null,WHERE子句将假:

复制代码代码如下:SELECT * FROM T1和T2(左1)T2方法= 5;
因此,您可以安全地将查询转换为公共连接:

复制代码如下:SELECT * FROM T1,T2,T2和T1,column2 = 5 = t2.column1之内;
这可以更快,因为如果你可以查询,MySQL可以在表T1 T2使用表,力表命令的使用,使用straight_join。

以上是本文的全部内容,希望能对大家有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部