推荐学习:mysql视频教程
一、mysql数据库join连接在多个表上创建索,并且多个表join和子查询语句相对比较困难。许多开发人员不自觉地认为join 会降低 sql 的性能效率,因此他们将多表 sql 拆分为单表查询,认为这会影响sql执行的效率,原因是开发人员不了解join实现过程。
联接之间的表关联使用索引进行匹配,假设表r和表s是连接的。
表r被称为驱动表,表r中通过where条件过滤的数据将在表s对应的索引上逐个查询。如果驱动表r的数据量不大,则上述算法非常有效。
以下三种 join 类型,驱动表各是哪张表:
select * from r left join s on r.x = s.x wehre ...select * from r right join s on r.x = s.x wehre ...select * from r inner join s on r.x = s.x wehre ...
1、inner join对于 inner join,驱动表可能是表 r,也可能是表 s。显示左边右边共有的数据。
在这种场景下,谁需要查询的数据量越少,谁就是驱动表。 我们来看下面的例子
select * from r inner join s on r.x = s.x where r.y = ? and s.z = ?
2、left join上述 left join 来说,驱动表就是左表 r;right join中,驱动表就是右表 s。这是 join 类型决定左表或右表的数据一定要进行查询。
返回包括左表中的所有记录和右表中联结字段相等的记录。即使右表中没有匹配,也从左表返回所有的行。
select * from r left join s on r.x = s.x where r.y = ? and s.z = ?
3、right join上述 left join 来说,驱动表就是左表 r;right join中,驱动表就是右表 s。这是 join 类型决定左表或右表的数据一定要进行查询。
返回包括右表中的所有记录和左表中联结字段相等的记录。即使左表中没有匹配,也从右表返回所有的行。
select * from r right join s on r.x = s.x where r.y = ? and s.z = ?
二、mysql数据库hash join1、什么是 hash joinmysql中的第二个 join 是 hash join,当两个表之间的连接条件没有索引时使用该算法。
如果没有连接,那么创建索引可以吗?
如果某些列是选择性低的索引,则在创建索引以导入数据时必须对数据进行排序,这会影响导入性能;辅助索引将出现返回表的问题。如果过滤的数据量很大,直接全表扫描会更快。
对于olap业务查询(olap 是在线分析处理,用于数据分析,它使我们能够同时分析来自多个数据库系统的信息),哈希连接是一个必不可少的功能。mysql 8.0开始支持 hash join算法,加强了对 olap 业务的支持。
因此,如果您的查询数据量不太大,并且查询的响应时间要求在分钟级别,则可以使用单实例mysql 8.0来完成大数据的查询。
2、hash join 工作原理hash join出现在mysql 8.0的执行计划中,hash join 扫描关联的两个表:首先,在扫描驱动器表的过程中创建一个哈希表;当扫描第二个表时,将在哈希表中搜索每个关联记录。如果找到,将返回记录。
哈希连接选择驱动程序表和嵌套循环连接算法,两者基本相同。两个较小的表都用作驱动程序表.如果驱动器表很大,并且创建的哈希表超过了内存大小,mysql将自动将结果转储到磁盘。
三、子查询我发现相当多的开发同学,包括我自己更喜欢编写子查询,而不是传统的join语句。
子查询的逻辑非常清晰。虽然 join 也可以满足需求,但这并不容易理解,因为left join是一种代数关系,子查询更倾向于从人类思维的角度来理解。
然而,在mysql 8.0中,优化器会自动将 in 子查询优化为 join 执行计划,这将显著提高性能。
我们只需要关注sql执行计划,如果两个执行计划相同,则性能没有差异。
在mysql 8.0之前,mysql没有完全优化子查询。因此,您将在子查询的执行计划中看到dependent subquery的提示,这表明它是一个从属子查询,子查询需要依赖外部表的关联。dependent subquery的执行速度可能非常慢,而且大多数时候您需要手动将其转换为两个表之间的连接。
所以这里博主提示大家,如果你的当前的mysql 8.0版本可以编写子查询,因为子查询的优化相当完整;
对于 mysql 8.0 之前版本的mysql,需要查看所有子查询的 sql 执行计划。对于 dependent subquery 的提示,要进行优化,否则将对业务产生重大性能影响;dependent subquery的优化通常被重写为用于表连接的派生表。
推荐学习:mysql视频教程
以上就是mysql原理总结之左连接、右连接、内连接与hash连接的详细内容。
