威尼斯wns.9778官网 > 计算机教程 > 详解Mysql多表联合查询效率分析及优化

原标题:详解Mysql多表联合查询效率分析及优化

浏览次数:142 时间:2020-04-01

Doing INTERSECT and MINUS in MySQL Doing an INTERSECT An INTERSECT is simply an inner join where we compare the tuples of one table with those of the other, and select those that appear in both while weeding out duplicates. So 复制代码 代码如下: SELECT member_id, name FROM a INTERSECT SELECT member_id, name FROM b can simply be rewritten to 复制代码 代码如下: SELECT a.member_id, a.name FROM a INNER JOIN b USING (member_id, name) Performing a MINUS To transform the statement 复制代码 代码如下: SELECT member_id, name FROM a MINUS SELECT member_id, name FROM b into something that MySQL can process, we can utilize subqueries (available from MySQL 4.1 onward). The easy-to-understand transformation is: 复制代码 代码如下: SELECT DISTINCT member_id, name FROM a WHERE (member_id, name) NOT IN (SELECT member_id, name FROM table2); Of course, to any long-time MySQL user, this is immediately obvious as the classical use-left-join-to-find-what-isn't-in-the-other-table: 复制代码 代码如下: SELECT DISTINCT a.member_id, a.name FROM a LEFT JOIN b USING (member_id, name) WHERE b.member_id IS NULL

3. MySQL如何优化LEFT JOIN和RIGHT JOIN在MySQL中,A LEFT JOIN B join_condition执行过程如下:

联接优化器计算表应联接的顺序。LEFT JOIN和STRAIGHT_JOIN强制的表读顺序可以帮助联接优化器更快地工作,因为检查的表交换更少。请注意这说明如果执行下面类型的查询,MySQL进行全扫描b,因为LEFT JOIN强制它在d之前读取:

user表:

Tips:

5)· 进行所有标准WHERE优化。

例如:

复制代码 代码如下:SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;

另外需要注意的地方 在MySQL中涉及到多表查询的时候,需要根据查询的情况,想好使用哪种连接方式效率更高。

user_id | action—————1 | jump1 | kick1 | jump2 | run4 | swim

从左表读出一条,选出所有与on匹配的右表纪录(n条)进行连接,形成n条纪录(包括重复的行,如:结果1和结果3),如果右边没有与on条件匹配的表,那连接的字段都是null.然后继续读下一条。

MySQL可以进行下面的LEFT JOIN优化:如果对于产生的NULL行,WHERE条件总为假,LEFT JOIN变为普通联接。

这样可以更快,因为如果可以使查询更佳,MySQL可以在表t1之前使用表t2。为了强制使用表顺序,使用STRAIGHT_JOIN。

2. 表连接的约束条件添加显示条件WHERE, ON, USING

因此,可以安全地将查询转换为普通联接:

mysql

引申:我们可以用右表没有on匹配则显示null的规律, 来找出所有在左表,不在右表的纪录, 注意用来判断的那列必须声明为not null的。如:sql:

 SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key; 
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key; 

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

复制代码 代码如下:SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column b. RIGHT [OUTER] JOIN:

user_action表:

一般用法:

分析:注意到user_action中还有一个user_id=4, action=swim的纪录,但是没有在结果中出现,而user表中的id=3, name=daodao的用户在user_action中没有相应的纪录,但是却出现在了结果集中因为现在是left join,所有的工作以left为准.结果1,2,3,4都是既在左表又在右表的纪录,5是只在左表,不在右表的纪录

上面sql的result:id | name | action————————–3 | daodao | NULL

2)· 根据LEFT JOIN条件中使用的所有表(除了B)设置表A。

4)· 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外。如果出现循环依赖关系,MySQL提示出现一个错误。

SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 

例子:

3. MySQL中的外连接,分为左外连接和右连接,即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL对应。

mysql

id | name———1 | libk2 | zyfon3 | daodao


7)· 如果使用LEFT JOIN找出在某些表中不存在的行,并且进行了下面的测试:WHERE部分的col_name IS NULL,其中col_name是一个声明为 NOT NULL的列,MySQL找到匹配LEFT JOIN条件的一个行后停止(为具体的关键字组合)搜索其它行。

复制代码 代码如下:SELECT * FROM table1,table2 WHERE table1.id=table2.id;

本文由威尼斯wns.9778官网发布于计算机教程,转载请注明出处:详解Mysql多表联合查询效率分析及优化

关键词:

上一篇:mysql修改数据库编码(数据库字符集)和表的字符编

下一篇:没有了