mysql进阶之关联查询

内容分享6小时前发布
0 1 0

什么是多表关联查询

将数据库中两张以上的数据表根据表中一样字段进行关联后查询数据。

mysql多表关联查询原理

通过嵌套循环匹配的方式实现多表关联。通过图示说明

表A 用户表

id

name

age

1

z

11

2

s

12

表B 部门表

course

uid

数学

1

语文

2

英语

1

数学

2

语文

1

表A、B以用户ID进行关联,以表A为主,关联后的结果如下

id

name

age

course

uid

1

z

11

数学

1

1

z

11

英语

1

1

z

11

语文

1

2

s

12

语文

2

2

s

12

数学

2

mysql循环嵌套伪代码如下

foreach(item01 in tbl01) { 循环表01的记录
	foreach(item02 in tbl02) { 循环表02的记录
     比较 item01与item02中条件字段的值
       如果一样,则将item02的记录与item01的拼接
       如果不同,继续比较下一条记录
  }
}
如果有多张表则依次按顺序嵌套循环比较

多表关联查询的类型

mysql支持的关联有内连接(inner join)、左连接(left join)、右连接(right join)三种。

  • 内连接返回多表中满足添加的记录
  • 左连接返回左表所有数据,如果右表有满足条件的数据则展示,没有满足条件的数据则显示null
  • 右连接返回的结果与左连接相反

图示

mysql进阶之关联查询

如何更优的使用关联查询

要避免的情况

由于mysql是使用嵌套循环查询实现的关联,所以在使用关联查询的时候要避免几种情况

1.不要将过多的表关联

2.不要将多张大表关联

上面几种情况可以思考通过分解查询实现。

如果避免不了将许多表或大表关联,可以使用提前终止等查询进行优化。

可优化的情况

1.衡量关联表的顺序

当两张表关联时,关联字段在第一张表可以没有索引,但在第二张表必定要有索引。

确保ON或者USING子句中的列上有索引。在创建索引的时候就要思考到关联的顺序。当表A和表B用列c关联的时候,如果优化器的关联顺序是B、A,那么就不需要在B表的对应列上建上索引。没有用到的索引只会带来额外的负担。一般来说,除非有其他理由,否则只需要在关联顺序中的第二个表的相应列上创建索引。

对于一个关联查询在执行前通过 explain查看SQL被优化后的关联顺序

关联表的顺序会影响查询进行嵌套循环和回溯操作的次数。不过目前mysql的关联查询优化器可以帮我们完成一部分优化工作,它会分析SQL的执行成本,自动优化数据表的关联顺序。但是我们在使用时也应该了解MySQL优化的原理。

2.提前终止查询

在发现已经满足查询需求的时候,MySQL总是能够立刻终止查询。一个典型的例子就是当使用了LIMIT子句的时候。除此之外,MySQL还有几类情况也会提前终止查询,例如发现了一个不成立的条件,这时MySQL可以立刻返回一个空结果。

-- 从电影表film中找出没有演员的所有电影
 SELECT film.film_id FROM sakila.film 
 LEFT OUTER JOIN sakila.film_actor USING(film_id) 
 WHERE film_actor.film_id IS NULL;

这个查询将会过滤掉所有有演员的电影。每一部电影可能会有许多的演员,但是上面的查询一旦找到任何一个,就会停止并立刻判断下一部电影,由于只要有一名演员,那么WHERE条件则会过滤掉这类电影。类似这种“不同值/不存在”的优化一般可用于DISTINCT、NOT EXIST()或者LEFT JOIN类型的查询。

© 版权声明

相关文章

1 条评论

  • 头像
    你我山巅自相逢 读者

    收藏了,感谢分享

    无记录
    回复