mysql 左join_MySQL查询优化之左Join和右Join优化教程

MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)

环境:

MySQL版本:5.5.15

操作系统:windows

本文讨论左Join 和右Join 优化(Left Join and Right Join Optimization)。

MySQL按如下方式实现A LEFT JOIN B:

表B被设置为依赖于表A和A所依赖的所有表。 表A被设置为依赖于在LEFT JOIN条件中使用的所有表(除了B)。 LEFT JOIN条件用于决定如何从表B中检索行(换句话说,不使用WHERE子句中的任何条件)。 所有标准连接优化都执行,不同之处在于一个表总是在它所依赖的所有表之后被读取。 如果有循环依赖,则会发生错误。 所有标准的WHERE优化都被执行。 如果A中存在与WHERE子句匹配的行,但B中没有与ON条件相匹配的行,则会生成一个额外的B行,并将所有列设置为NULL。 如果使用LEFT JOIN查找某些表中不存在的行,并且您有以下测试:在WHERE部分中,col_name是NULL,其中col_name是一个声明为NOT NULL的列,MySQL将停止搜索更多行(为了找到一行符合LEFT JOIN条件的特定组合键)。

RIGHT JOIN实现类似于LEFT JOIN,其表格角色颠倒了。 右连接转换为等效的左连接

连接优化器计算连接表的顺序。 由LEFT JOIN或STRAIGHT_JOIN强制的表读顺序可以帮助联接优化器更快地完成工作,因为检查的表排列更少。 这意味着如果执行以下类型的查询,MySQL会对b执行完整扫描,因为LEFT JOIN强制在d之前读取它:

SELECT *

FROM a JOIN b LEFT JOIN c ON (c.key=a.key)

LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

在这种情况下,修复与在FROM子句中列出a和b的顺序相反:

SELECT *

FROM b JOIN a LEFT JOIN c ON (c.key=a.key)

LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

对于LEFT JOIN,如果WHERE条件对于生成的NULL行始终为false,则将LEFT JOIN更改为正常连接。 例如,如果t2.column1为NULL,则WHERE子句在以下查询中将为false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,将查询转换为正常联接是安全的:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

现在优化器可以在表t1之前使用表t2,如果这样做会导致更好的查询计划。 要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Mysql数据库中连接left join连接right join和内连接inner join的介绍和演示: 1. 连接left join 连接left join会返回表中所有的记录,以及表中符合条件的记录。如果表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table LEFT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有学生的姓名和成绩,如果学生没有成绩,则成绩为NULL。 ```sql SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.id; ``` 2. 连接right join 连接right join会返回表中所有的记录,以及表中符合条件的记录。如果表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table RIGHT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有成绩和对应的学生姓名,如果成绩表中没有对应的学生,则姓名为NULL。 ```sql SELECT students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.id; ``` 3. 内连接inner join 内连接inner join会返回表中都符合条件的记录。 语法: ``` SELECT * FROM a_table INNER JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有有成绩的学生的姓名和成绩。 ```sql SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值