转换了一下字符集就成功了 ALTER TABLE user CONVERT TO CHARSET utf8mb4;
1.执行计划 EXPLAINSELECT*FROMt2LEFTJOINt1ONt1.bill_num=t2.bill_num 这里出现了Using where; Using join buffer (Block Nested Loop) 50w数据查询了一两分钟没有查询出来,到底是为什么? 什么是:BNL BNL(Block Nested-Loop Join)算法 NLJ的原理是内外两层循环,对外循环中的每条记录,都要再内循环中做一次检索。
Block Nested-Loop Join算法: BNL算法原理:将外层循环的行/结果集存入join buffer,内存循环的每一行数据与整个buffer中的记录做比较,可以减少内层循环的扫描次数。 通过EXPLAIN发现,extra中有数据是Using join buffer (Block Nested Loop);一般多表关联查询会有这种算法,优化方式就是在关联条件字段上加上索引。 导致关...
github地址:go-fly
1、Simple Nested-Loop Join for(表A) { for(表B) } 被驱动表上没有索引,每次循环都会全表扫描 如果只看结果的话,这个算法是正确的,而且这个算法也有一个名字,叫做“Simple Nested-Loop Join”。当然,MySQL 也没有使用这个 Simple Nested-Loop Join 算法,而是使用了另一个叫作“Block Nested-Loop Join”的...
(2) Index Nested-Loop Join:这就是join左右字段都加索引后的查询,这意味着驱动表的选择不在于我们自身,而是由MySQL优化器决定,当驱动表的结果交给被驱动表时,被驱动表直接通过索引定位到关联数据并阻塞。 (3) Block Nested-Loop Join:没有索引列的情况都会选择该算法而不优先考虑Simple Nested-Loop Join,Block ...
理想情况下,用索引匹配是最高效的一种方式,但是在现实工作中,并不是所有的列都是索引列,这个时候就需要用到 Block Nested-Loop Join 方法了,这种方法与第一种方法比较类似,唯一的区别就是会把驱动表中 left join 涉及到的所有列(不止是用来on的列,还有se...
理想情况下,用索引匹配是最高效的一种方式,但是在现实工作中,并不是所有的列都是索引列,这个时候就需要用到 Block Nested-Loop Join 方法了,这种方法与第一种方法比较类似,唯一的区别就是会把驱动表中 left join 涉及到的所有列(不止是用来on的列,还有select部分的列)先取出来放到一个缓存区域,然后再去和非...
嵌套循环连接分为三种细分类型:简单嵌套循环连接(Simple Nested-Loop Join)、索引嵌套循环连接(Index Nested-Loop Join)和块嵌套循环连接(Block Nested-Loop Join)。接下来,我们将逐一解析这三种连接方法。首先,介绍两个概念:驱动表(又称外表)和被驱动表(又称非驱动表,匹配表或内表)。简单...
Block Nested Loop Join算法 BNL 算法:将外层循环的行/结果集存入join buffer, 内层循环的每一行与整个buffer中的记录做比较,从而减少内层循环的次数。 那么是不是因为lift join语句没有使用 Block Nested Loop算法所以很慢呢使用EXPLAIN分析发现使用的已经是Block Nested Loop算法了,所以也不是这个原因。