首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

掌握MySQL连接查询到底什么是驱动表

连接查询没有where条件时,左连接查询时,前面的表是驱动表,后面的表是被驱动表,右连接查询时相反,内连接查询时,哪张表的数据较少,哪张表就是驱动表 当连接查询where条件时,带where条件的表是驱动表...连接查询优化 要理解连接查询优化,得先理解连接查询的算法,连接查询常用的一共有两种算法,我们简要说明一 Simple Nested-Loop Join Algorithms (简单嵌套循环连接算法)...是不会使用的 for (row1 : 驱动表) { 索引在被驱动表中命中,不用再遍历被驱动表了 } Block Nested-Loop Join Algorithm(基于连接嵌套循环算法)...其实很简单就是把一行变成了一批,嵌套循环(BNL)嵌套算法使用对在外部循环中读取的行进行缓冲,以减少必须读取内部循环中的表的次数。...MySQL连接缓冲区大小通过这个参数控制 :join_buffer_size MySQL连接缓冲区有一些特征,只有无法使用索引时才会使用连接缓冲区;联接中只有感兴趣的列存储在其联接缓冲区中,而不是整个行

1.9K40

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点5:表连接算法(join algorithm)

BNL一般用于内连接通过嵌套循环连接可以大大降低对内部表的扫描次数。...使用嵌套循环(BNL)时,较大的连接缓冲区意味着可以将驱动表(外部表)的所有行都存储在连接缓冲区中; 使用嵌套循环(BNL)时,较大的连接缓冲区意味着对连接操作的右侧表进行的顺序访问就越多。...EXPLAIN查看BKA 的使用 运行SQL时,可以使用EXPLAIN来查看MySQL优化器执行查询的计划,当一个表在查询执行计划中出现 “Using join buffer (Batched Key...MySQL 8.0.20之前的版本,如果连接的表对没有至少一个等值连接条件,则无法使用哈希连接,并且会使用较慢的嵌套循环算法。...MySQL 8.0.20及更高的版本,MySQL不再支持嵌套循环连接,而是使用散列连接来代替所有的嵌套循环连接的情况。

29321
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL通过索引优化-这里可能有你不知道的索引优化细节(二)

索引优化细节 1. union all,in,or都能够使用索引,但是推荐使用in 还是用sakila这个数据库的表 mysql> explain select * from actor where actor_id...范围列可以用到索引 范围条件是:、>=、between 范围列可以用到索引,但是范围列后面的列无法用到索引,索引最多用于一个范围列 关于范围列使用索引以及索引生效规则,索引优化细节(一)有提到...MySQL的join使用的是嵌套循环算法 Nested-Loop Join Algorithm 一种简单的嵌套循环联接(NLJ)算法,一次从一个循环中的第一个表中读取行,并将每行传递到一个嵌套循环中,...Block Nested-Loop Join Algorithm 嵌套循环(BNL)嵌套算法使用对在外部循环中读取的行的缓冲来减少必须读取内部循环中的表的次数。...优化2:使用覆盖索引,查询的结果变成 select transaction_id,而不是select *,当extra出现using index,表示使用了覆盖索引 mysql> explain select

85020

SQL联表细节,MySQL JOIN 的执行过程

绝大多少情况是适用的,特别是 EXPLAIN     LEFT JOIN 某些情况会被查询优化优化成 INNER JOIN;结果集指的是表中记录过滤后的结果,而不是表中的所有记录,如果无过滤条件则是表中所有记录...联表算法   MySQL 的联表算法是基于嵌套循环算法(nested-loop algorithm)而衍生出来的一系列算法,根据不同条件而选用不同的算法 在使用索引关联的情况,有 Index Nested-Loop...这种算法简单粗暴,但毫无性能可言,时间性能上来说是 n(表中记录数) 的 m(表的数量) 次方,所以 MySQL 做了优化,联表查询的时候不会出现这种算法,即使在无 WHERE 条件且 ON 的连接键上无索引时...,也不会选用这种算法   Block Nested-Loop     缓存嵌套循环连接,简称 BNL,是对 INL 的一种优化;一次性缓存多条驱动表的数据,然后拿 Join Buffer 里的数据批量与内层循环读取的数据进行匹配...,再取驱动表的下一条记录重复联表操作;   3、MySQL 的连接算法基于嵌套循环算法,基于不同的情况而采用不同的衍生算法   4、关于 ON 和 WHERE,我们下篇详细讲解,大家可以先考虑它们的区别

4.8K10

mysql进阶优化篇04——深入JOIN语句的底层原理

查询的表就是驱动表,反之就是被驱动表。通过 explain 关键字可以查看。...我们要明白优化器的优化原理:对于内连接mysql会选择扫描次数比较少的作为驱动表,因此实际生产中最好使用Explain测试验证。...驱动表中的每条记录通过被驱动表的索引进行访问,因为索引查询的成本是比较固定的,故 MySQL 优化器都倾向于使用记录数少的表作为驱动表(外表)。...4 Block Nested-Loop Join(快嵌套循环连接) 如果存在索引,那么会使用 index 的方式进行 join,如果 join 的列没有索引,被驱动表要扫描的次数太多了。...为了减少被驱动表的 IO 次数,就出现了 Block Nested-Loop Join 不再是逐条获取驱动表的数据,而是一的获取,引入了 join buffer 缓冲区,将驱动表 join 相关的部分数据列

1.4K20

不要再问我 in,exists 走不走索引了...

它是以外层表为驱动表,无论如何都会循环遍历的,所以会全表扫描。而内层表通过走索引,可以快速判断当前记录是否匹配。 效率如何? 针对网上说的 exists 一定比 in 的执行效率高,我们做一个测试。...但是和 explain使用,就会显示出优化后的sql。需要注意使用顺序。 show warnings; 在结果 Message 里边就会显示我们要的语句。 ?...以上边的两个维度(查询优化器和执行计划)分别来对比一。...join 的嵌套循环 (Nested-Loop Join) 为了理解为什么这里的 in 会转换为 join ,我感觉有必要了解一 join 的三种嵌套循环连接。...Join ,简称 BNLJ 索引嵌套连接,是通过缓存外层表的数据到 join buffer 中,然后 buffer 中的数据批量和内层表数据进行匹配,从而减少内层循环的次数。

1.7K20

mysql explain ref列_MySQL EXPLAIN详解

大部分情况利用索引排序更快,所以一般这时也要考虑优化查询了。...Using join buffer 使用连接缓存:Block Nested Loop,连接算法是嵌套循环连接;Batched Key Access,连接算法是批量索引连接 impossible where...mysql是如何执行一条sql语句的;解释的内容主要包括表的连接方式和顺序,以及索引的使用情况。...使用explain,可以分析出需要在哪里加上索引,以及调整表的连接,以达到优化查询的目的;explain命令之后不仅可以跟select语句,也可以跟delete,insert,update,replace...Using join buffer:该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

3.4K60

神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)

绝大多少情况是适用的,特别是 EXPLAIN     LEFT JOIN 某些情况会被查询优化优化成 INNER JOIN;结果集指的是表中记录过滤后的结果,而不是表中的所有记录,如果无过滤条件则是表中所有记录...联表算法   MySQL 的联表算法是基于嵌套循环算法(nested-loop algorithm)而衍生出来的一系列算法,根据不同条件而选用不同的算法 在使用索引关联的情况,有 Index Nested-Loop...,也不回选用这种算法   Block Nested-Loop     缓存嵌套循环连接,简称 BNL,是对 INL 的一种优化;一次性缓存多条驱动表的数据,然后拿 Join Buffer 里的数据批量与内层循环读取的数据进行匹配...,再取驱动表的下一条记录重复联表操作;   3、MySQL 的连接算法基于嵌套循环算法,基于不同的情况而采用不同的衍生算法   4、关于 ON 和 WHERE,我们下篇详细讲解,大家可以先考虑它们的区别...,以及生效时间 参考 Mysql多表连接查询的执行细节(一)

93820

线上mysql出现Block Nested-Loop Join问题

最近线上遇到一个问题,后台一个查询把服务给整挂了,然后找了dba看了sql慢查询,我们explain结果。...---- 关于:Block Nested-Loop Join,是Nested-Loop Join的一种优化,叫缓存嵌套循环连接,缓存嵌套循环连接通过一次性缓存多条数据,把参与查询的缓存的列缓存到join...limit 10; 我们对两个sql都进行explain 查询打分的没有出现嵌套循环连接,因为使用到索引,mysql已经知道join的数据没有不用再扫描。...查询未打分的出现嵌套循环连接,mysql没使用到索引,mysql join的部分没有数据会扫描b表所有的数据。...join表,如果实在需要大结果集连接小结果集,我们考虑先把大结果集和小结果集是否能够使用查询来结果,当然这个还是要看需求是怎么样的,不一定我这里的子查询和你的需求是一样的,不能一概而论,但是只要出现嵌套查询连接

1.8K20

Oracle执行计划详解

ROWID或rowid lookup)   行的ROWID指出了该行所在的数据文件、数据以及行在该中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法...一个rowid唯一的表示一行数据,该行对应的数据通过一次i/o得到的,在此情况该次i/o只会读取一个数据库。   ...在特殊情况我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量不使用笛卡儿乘积,否则,自己想结果是什么吧!   注意在下面的语句中,在2个表之间没有连接。   ...只有在全表扫描情况才能使用读操作。...Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。

1.5K70

Oracle执行计划详解

ROWID或rowid lookup)   行的ROWID指出了该行所在的数据文件、数据以及行在该中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法...一个rowid唯一的表示一行数据,该行对应的数据通过一次i/o得到的,在此情况该次i/o只会读取一个数据库。   ...在特殊情况我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量不使用笛卡儿乘积,否则,自己想结果是什么吧!   注意在下面的语句中,在2个表之间没有连接。   ...只有在全表扫描情况才能使用读操作。...Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。

3.1K100

explain | 索引优化的这把绝世好剑,你真的会用吗?

如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。 慢查询的确会导致很多问题,我们要如何优化查询呢?...索引优化的步骤是: 使用explain查看sql执行计划 判断哪些索引使用不当 优化sql,sql可能需要多次优化才能达到索引使用的最优值 既然索引优化的第一步是使用explain,我们先全面的了解一它...当EXPLAIN与可解释的语句一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理该语句,包括有关如何连接以及以何种顺序连接表的信息。...在这种情况,您可以通过检查该WHERE 子句以检查它是否引用了某些适合索引的列,从而提高查询性能。 key列 该列表示实际用到的索引。...Using join buffer    表示是否使用连接缓冲。来自较早联接的表被部分读取到联接缓冲区中,然后从缓冲区使用它们的行来与当前表执行联接。

97820

【MySQL 文档翻译】理解查询计划

你的目标是认识到 EXPLAIN 计划表明查询优化好, 如果发现一些低效的操作, 可以通过学习 SQL 语法和索引技术来改进查询计划.使用 EXPLAIN 优化查询EXPLAIN 语句提供有关 MySQL...也就是说, MySQL 解释了它将如何处理该语句, 包括有关表 如何连接 以及以 何种顺序 连接的信息....通常, 您可以 ALL 通过添加索引来避免基于先前表中的常量值或列值从表中检索行.哇偶, 好厉害, 感觉这个得掌握一哦解释额外信息输出列 Extra 包含 EXPLAIN 有关 MySQL 如何解析查询的附加信息...(Block Nested Loop) 指示使用嵌套循环算法,(Batched Key Access) 指示使用批量 key 访问算法, (hash join) 表示使用散列连接....有关这些优化的更多信息, 请参阅第 8.2.1.4 节,"哈希连接优化"和 嵌套循环连接算法.有关批量密钥访问算法的信息, 请参阅批量密钥访问连接.- Using MRR使用多范围读取优化策略读取表.

2.1K20

EXPLAIN的作用

EXPLAIN 的主要作用是帮助开发者理解查询语句的执行过程,以及查询优化如何选择索引、表扫描方式等。通过分析 EXPLAIN 的输出结果,开发者可以找到查询性能的瓶颈,并对查询语句进行优化。...使用 EXPLAIN 的主要目的是分析和优化查询语句的执行计划。以下是一些使用 EXPLAIN 的重要原因:查询性能分析: 通过 EXPLAIN,你可以深入了解 MySQL 是如何执行查询的。...连接类型分析: 对于涉及多个表的查询EXPLAIN 显示了连接类型(如嵌套循环连接、哈希连接等)。这有助于了解查询的复杂性和连接操作的开销。...临时表和文件排序分析: 如果查询需要使用临时表或执行文件排序,EXPLAIN 也会提供这方面的信息。这有助于评估查询中是否需要优化排序操作或调整查询。...查询优化通过查看 EXPLAIN 的输出,你可以根据实际情况进行调整查询语句。例如,可能需要更改 WHERE 子句中的条件、添加或调整索引,以及优化查询以减少临时表的使用等。

10810

最详细的 MySQL 执行计划和索引优化

不管是工作中,还是面试中,关于mysql的explain执行计划以及索引优化,都是非常值得关注的。...在这种情况,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。...,首先内连接查出全部id,会走name字段索引,再通过id进行联表查五个值即可 图片 5.3,join 连接查询优化 表关联主要有两种常见的算法 嵌套循环连接 Nested-Loop Join(NLJ...) 算法 基于嵌套循环连接 Block Nested-Loop Join(BNL) 算法 接下来来一个示例,创建两张表,一张表插入 100 条数据,一张表插入 10000 条数据。...「2,基于嵌套循环连接 Block Nested-Loop Join(BNL) 算法」这里主要针对在关联查询时没有建立索引的字段 EXPLAIN select * from t1 inner join

31421

简单了解SQL性能优化工具MySql Explain

写在前面 MySql Explain是对SQL进行性能优化不可或缺的工具,通过他我们可以对SQL进行一定的分析和性能优化,降低线上业务因慢查询造成的性能损失。...了解Explain 执行计划依赖于表,列,索引等细节和where中的条件,mysql优化器利用多种技术来有效的执行一条sql中的查询语句,比如在大表中的一个查询可以不通过全表扫描来完成。...一个涉及到多表的join操作可以避免比较每种的组合情况,优化器选择最优的效果查询对一个集合进行操作,通过explain语句可以获取mysql如何执行语句的信息。...输出信息 explain对select语句操作返回一行输出信息,表示的顺序是mysql处理语句时实际读取表的顺序。 mysql通过嵌套循环方式解决所有join操作。...Using join buffer 使用连接缓存:Block Nested Loop,连接算法是嵌套循环连接;Batched Key Access,连接算法是批量索引连接 impossible where

1.5K20

PostgreSQL技术大讲堂 - 第30讲:多表连接方式

merge join hash join 支持所有join操作: NATURAL INNER JOIN INNER JOIN LEFT/RIGHT OUTER JOIN FULL OUTER JOIN 嵌套循环连接方式...Nested Loop Join 嵌套循环联接是最基本的联接操作,它可以用于任何联接条件。...Nested Loop Join图解 Materialized Nested Loop Join 我们使用面的具体示例来探索执行器如何处理具体化嵌套循环连接的计划树,以及如何估计成本。...Hash Join 计划器处理转变 预处理 1、计划和转换CTE(如果查询中带有with列表,则计划器通过SS_process_ctes()函数处理每个with查询) 2、向上拉子查询 根据子查询的特点...张,应用动态规划得到最优的计划 2、表数量大于12张,应用遗传查询优化器 参数 geqo_threshold指定的阈值(默认值为12) 3、分为不同的级别层次来处理 多表查询连接顺序选择 SGetting

16810

EXPLAIN FORMAT=json和EXPLAIN ANALYZE查询计划解读

比如我们上边的查询本来是一个左(外)连接查询,但是有一个s2.common_field IS NOT NULL的条件,着就会导致查询优化器把左(外)连接查询优化为内连接查询,从SHOW WARNINGS...如何使用EXPLAIN ANALYZE 我们将使用 Sakila 样本数据库中的数据和一个查询举例说明,该查询列出了每个工作人员在 2005 年 8 月累积的总金额。...这些估计是由查询优化器根据可用统计信息在执行查询之前进行的。该信息也会在 EXPLAIN FORMAT = TREE 输出中。 我们将从最后面的循环数开始。此过滤迭代器的循环数为 2。 这是什么意思?...这意味着我们正在执行嵌套循环连接,在其中扫描 staff 表,然后针对该表中的每一行,使用索引查找和过滤的付款日期来查找 payment 表中的相应条目。...如果我们看一嵌套循环迭代器(第 11 行)中上一级接收所有行的时间,为 46.135 毫秒,这是运行一次过滤迭代器的时间的两倍多。

2.5K31

mysql优化概述

query_cache_size : 使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。...,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。...extra Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句。...常见的提示信息大概有: Using index : 查询列表以及搜索条件中只包含属于某个索引的列,也就是在可以使用索引覆盖,不需要回表。...,当被驱动表不能有效的利用索引加快访问速度,MySQL一般会为其分配一名叫join buffer的内存来加快查询速度,也就是我们所讲的基于嵌套循环算法。

44110

mysql优化概述

query_cache_size : 使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。...,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。...如EXPLAIN SELECT * FROM s1 WHERE id = 5, 一次就能匹配到 eq_ref: 在连接查询时,如果被驱动表是通过主键或者唯一二级索引(unique)等值匹配的方式进行访问的...extra Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句。...,当被驱动表不能有效的利用索引加快访问速度,MySQL一般会为其分配一名叫join buffer的内存来加快查询速度,也就是我们所讲的基于嵌套循环算法。

50720
领券