展开

关键词

join 语句怎么优化?

Simple Nested-Loop Join 我们来看一下当进行 join 操作时,mysql是如何工作的。常见的 join 方式有哪些? buffer,我们可以执行如下语句查看 join buffer 的大小 show variables like '%join_buffer%' 把我们之前用的 single_table 表搬出来, 语句,MySQL优化器可能会选择表 t1 或者 t2 作为驱动表,这样会影响我们分析sql语句的过程,所以我们用 straight_join 让mysql使用固定的连接方式执行查询 select * join buffer ,说明连接操作是基于 「Block Nested-Loop Join」 算法 Index Nested-Loop Join 了解了 「Block Nested-Loop Join 当然这个结论的前提是可以使用被驱动表的索引」 「总而言之,我们让小表做驱动表即可」 「当 join 语句执行的比较慢时,我们可以通过如下方法来进行优化」 进行连接操作时,能使用被驱动表的索引 小表做驱动表

12620

35 | join语句优化

一般来说,使用join语句,会用到两种算法,分别是Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。 但是,如果一个使用 BNL 算法的 join 语句,多次扫描一个冷表,而且这个语句执行时间超过 1 秒,就会在再次扫描冷表的时候,把冷表的数据页移到 LRU 链表头部。 但是,由于我们的 join 语句在循环读磁盘和淘汰内存页,进入 old 区域的数据页,很可能在 1 秒之内就被淘汰了。 之后的 join 语句,扫描表 t1,这里的扫描行数是 1000;join 比较过程中,做了 1000 次带索引的查询。 相比于优化前的 join 语句需要做 10 亿次条件判断来说,这个优化效果还是很明显的。

20910
  • 广告
    关闭

    【玩转 Cloud Studio】有奖调研征文,千元豪礼等你拿!

    想听听你玩转的独门秘籍,更有机械键盘、鹅厂公仔、CODING 定制公仔等你来拿!

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

    34 | join语句的使用

    在这个语句里,t1 是驱动表,t2 是被驱动表。 explain的结果: ? 在这条语句里,被驱动表 t2 的字段 a 上有索引,join 过程用上了这个索引。 在这个查询过程,也是扫描了 200 行,但是总共执行了 101 条语句,比直接 join 多了 100 次交互。除此之外,客户端还要自己拼接 SQL 语句和结果。 显然使用join会好一点。 结论: 使用 join 语句,性能比强行拆成多个单表执行 SQL 语句的性能要好; 如果使用 join 语句的话,需要让小表做驱动表。 而能否用上被驱动表的索引,对 join 语句的性能影响很大。 如果可以使用被驱动表的索引,join 语句还是有其优势的; 不能使用被驱动表的索引,只能使用 Block Nested-Loop Join 算法,这样的语句就尽量不要使用; 在使用 join 的时候,应该让小表做驱动表

    22420

    Mysql Join语句的优化

    尽可能减少Join语句中Nested Loop的循环总次数 最有效的办法是让驱动表的结果集尽可能地小,这也正是在本章第二节中所提到的优化基本原则之一——“永远用小结果集驱动大结果集” 比如,当两个表(表 A和表B)Join时,如果表A通过WHERE条件过滤后有10条记录,而表B有20条记录。 保证Join语句中被驱动表的Join条件字段已经被索引 其目的正是基于上面两点的考虑,只有让被驱动表的Join条件字段被索引了,才能保证循环中每次查询都能够消耗较少的资源,这也正是内层循环的实际优化方法 当无法保证被驱动表的Join条件字段被索引且内存资源充足时,不要太吝惜Join Buffer的设置 在Join是All、Index、range或index_merge类型的特殊情况下,Join Buffer 在这种情况下,Join Buffer的大小将对整个Join语句的消耗起到非常关键的作用

    71960

    MySQL中的join语句

    MySQL中的join语法 在MySQL中,join语句想必大家都不陌生,今天我们围绕join语句展开,说一些可能平时不关注的知识点。 整个join语句的执行过程如下: a、从表t1中拿到一条记录的字段a值 b、拿a的值去t2表中查找,查找匹配的行 c、找到结果,和表t1中的行拼接成一行记录,作为结果的一条记录 d、重复以上三个步骤,直到 这里,我们简单推一下复杂度的公式: 假设驱动表的记录为M,被驱动表的值是N,因为被驱动表使用了索引,在一棵b+树上索引的查找效率近似logN,因为我们的语句时select * ,要牵扯到回表到聚集索引查询所有字段 不同的地方在于: 1、BNLJ算法会将驱动表t1的记录先放在join buffer中,然后从t2上一条一条获取记录,和join buffer中的记录匹配,找到符合条件的记录放入结果集; 2、如果join 在我们使用BNLJ的时候,如果join buffer比较小,那么被驱动表就会访问多次,join buffer越大,那么被驱动表的扫描次数就越少,join的性能就越高。

    25610

    sql语句中的left join,right join,inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接 sql语句如下: select * from A left join B on A.aID = B.bID 结果如下: aID     aNum     bID     bName 1 是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的. B表记录不足的地方均为NULL. -------------------------------------------- 2.right join sql语句如下: select * from 语句如下: select * from A innerjoin B on A.aID = B.bID 结果如下: aID     aNum     bID     bName 1

    38460

    Hive Join详解

    最近对hive的join用的比较多,特地归纳下常用的各种连接,看看hive的连接和我们普通的是否有不同。 2222 2222 Time taken: 21.597 seconds, Fetched: 2 row(s)          可见inner join和直接逗号连接效果是一样的。 (3)左连接left join: hive (cfpd_ods_safe)> select * from ta left join tb on ta.uid=tb.uid; ta.uid tb.uid 效果和逗号连接一样,逗号其实是inner join的简写。 (2)不带条件的所有连接都是笛卡尔积 (3)left join和left outer join是一样的,full join和full outer join是一样的。right一样。

    51320

    Mysql - JOIN 详解

    0 索引 JOIN语句的执行顺序 INNER/LEFT/RIGHT/FULL JOIN的区别 ON和WHERE的区别 1 概述 一个完整的SQL语句中会被拆分成多个子句,子句的执行过程中会产生虚拟表(vt 2 JOIN的执行顺序 以下是JOIN查询的通用结构: SELECT <row_list> FROM <left_table> <inner|left|right> JOIN <right_table > ON <join condition> WHERE <where_condition> 它的执行顺序如下(SQL语句里第一个被执行的总是FROM子句): FROM:对左右两张表执行笛卡尔积 上文引用的文章中提到了标准SQL定义的FULL JOIN,这在mysql里是不支持的,不过我们可以通过LEFT JOIN + UNION + RIGHT JOIN 来实现FULL JOIN: SELECT 所以当你纠结使用LEFT JOIN还是RIGHT JOIN时,尽可能只使用LEFT JOIN吧。

    2.9K51

    SQL中 inner join、left join、right join、full join 到底怎么选?详解来了

    要么是业务不熟悉,对数据的理解不够深入;要么就是对各种联表查询的细微的差别了解的不够深入; 首先来看一下数据库表链接的几种方式 inner join 内连接 left join 左连接 right join 内连接查询两张表直接的交集部分,只保留两张表都有的字段 # INNER JOIN SELECT * FROM user_info AS ur INNER JOIN city_info JOIN SELECT * FROM user_info AS ur LEFT JOIN city_info AS ci ON ur.city_id = ci.id; 右连接 right join 和左连接正好相反,返回右边表的所有行,即使左边没有行与之匹配,未匹配上的显示null #RIGHT JOIN SELECT * FROM user_info AS ur RIGHT JOIN NATURAL RIGHT JOIN t2; 怎么样?

    11420

    详解hive的join优化

    优化自动join转换 当自动join启动了,query中就不需要map-join的提示了。 这意味着即使inner join可以转换为map join,outer join也无法转换为map join。 自动join转换也会影响sort-merge-bucket join。 当Hive根据配置转换join为map-join时,会在这些转换结束时尽可能地将尽可能多的join组合在一起。 自动转换为SMB map join Sort-Merge-Bucket(SMB)join也可以转换为SMB map join。在表进行排序和分桶的任何地方都可以使用SMB连接。

    1.8K10

    【MySQL】之join算法详解

    在阿里巴巴的java开发手册有这么一条强制规定:超过三个表禁止join,需要join的字段,数据类型保持绝对一致,多表关联查询时,要保证被关联的字段需要有索引。 为什么尽量避免使用join?如果使用join,我们应该怎么用呢?接下来我们就一起聊一聊关于join的几种算法。 把参与查询的列缓存到join buffer里,然后拿join buffer里的数据批量与内层表的数据在join buffer中进行匹配,满足join条件的,作为结果集的一部分返回。 join buffer的大小是由参数join_buffer_size设定,默认256k。如果一次放不下驱动表的所有数据,会分段放,这种情况下会导致被驱动表扫描多次。 适当增大join_buffer_size的值,缓存的数据越多,就越能减少被驱动表扫描的次数。 减少不必要的字段查询。 需要join的字段,数据类型保持绝对一致。

    24620

    图解 SQL join 语句内联合(inner join)全外联合(full outer join)左外联合(left outer join)笛卡尔积 (交叉联合(cross join))

    inner join SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id Full outer join SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name id name null null 3 Ninja 4 Ninja 4 Spaghetti null null 为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录 ---- 2 Monkey null null 4 Spaghetti null null 为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录 )) 还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示: SELECT * FROM TableA CROSS JOIN TableB 这个把“所有”联接到“所有”,产生4

    1.1K20

    Mysql常用sql语句(16)- inner join 内连接

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 利用条件表达式来消除交叉连接(cross join )的多余数据行 inner join通过 来设置条件表达式,如果没有加on的话,inner join和cross join是相同的 on 和 inner join ... on 其实效果也是一样的 (但在标准sql中,cross join是不支持on的,只是Mysql支持) crossjoin ... on inner join 的语法格式 SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句] inner join 可以连接 ≥ 两个的表 inner join 也可以使用 where 来指定连接条件,但是 是官方标准写法,而且 where 可能会影响查询性能 innerjoin ... on inner join 也可以只写 join 不加 inner 先看看dept、emp表有什么数据 dept表 ?

    24910

    Mysql常用sql语句(15)- cross join 交叉连接

    测试必备的Mysql常用sql语句 https://www.cnblogs.com/poloyy/category/1683347.html 前言 交叉连接就是求多表之间的笛卡尔积 讲道理..这个我都不怎么常用 ,(2,4)} 在Mysql中,表与表之间的笛卡尔积不建议使用,会产生大量不合理的数据; 假设两张表各有100条记录,那么表与表的笛卡尔积的数据量就有100*100=10000条了... cross join 的语法格式 SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE] SELECT <字段名> FROM <表1>, <表2> [WHERE子句] 先看看dept cross join单独使用的栗子 select * from emp cross join dept; ? 总记录数 = emp记录数(9) * dept记录数(4) = 36 cross join + where 的栗子 select * from emp as a cross join dept as b

    26020

    细品mysql之Join 语句的执行过程

    背景 今天优化了一个,join关联查的语句,需要优化join语句,那我们肯定得了解他的一个执行过程。正所谓知己知彼,百战百胜!! join的查询算法 1. Simple Nested-Loop Join(简单的嵌套循环连接) 简单嵌套循环算法的查询过程是嵌套查询,这个关联查询语句首先不能确定那个是驱动表,因为使用join的话,mysql的优化器会自己进行索引的选择 那就是使用Block Nested-Loop Join这个算法 查询过程:把表 t1 的数据读入线程内存 join_buffer 中,由于我们这个语句中写的是 select *,因此是把整个表 t1 行 join_buffer 满了,继续第 2 步; 扫描表 t2,把 t2 中的每一行取出来,跟 join_buffer 中的数据做对比,满足 join 条件的,作为结果集的一部分返回;清空 join_buffer 如果是 Index Nested-Loop Join 算法,应该选择小表做驱动表;如果是 Block Nested-Loop Join 算法:在 join_buffer_size 足够大的时候,是一样的

    25532

    laravel高级的Join语法详解以及使用Join多个条件

    在laravel中我们常常会使用join,leftjion和rightjoin进行连表查询,非常的方便,但是我今天遇到一个问题,就是链表查询需要on多个条件,即我要订单的id和发货人都一样,默认的join ) - join('contacts', function ($join) { $join- on('users.id', '=','contacts.user_id')- on('users.usename 此闭包会接收 JoinClause 对象,让你可以在 join 子句上指定约束: DB::table('users') - join('contacts', function ($join) { 这些方法会比较字段和一个值,来代替两个字段的比较: DB::table('users') - join('contacts', function ($join) { $join- on 语法详解以及使用Join多个条件就是小编分享给大家的全部内容了,希望能给大家一个参考。

    30321

    图文并茂详解 SQL JOIN

    Join是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用Join:内联接、外联接和交叉联接等。 4、特殊 Join:Semi-join 和 Anti-semi-join Semi Join 也叫半连接,Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回 不同于其他的联接运算,Semi-join和Anti-semi-join没有明确的语法来实现,但Semi-join和Anti-semi-join在RDBMS中有多种应用场合。 与 anti-join 区别 5、select * from A,B; 不带 where 或者 join 等同于 cross join,带 where 或   等同于 inner join 6、left  SQL Join的一些总结 http://www.cnblogs.com/rush/archive/2012/03/27/2420246.html [4] 简单介绍join,outer-join,semi-join

    98380

    ——Hive连接JOIN用例详解

    SQL里面通常都会用Join来连接两个表,做复杂的关联查询。比如用户表和订单表,能通过join得到某个用户购买的产品;或者某个产品被购买的人群.... bb.txt' overwrite into table bb; Loading data to table test.bb OK Time taken: 0.321 seconds 内连接 内连接即基于on语句 hive> select * from aa a join bb b on a.c=b.a; WARNING: Hive-on-MR is deprecated in Hive 2 and may not hive> select * from aa a right outer join bb b on a.c=b.a; WARNING: Hive-on-MR is deprecated in Hive bb; Warning: Map Join MAPJOIN[9][bigTable=?]

    55080

    SQL的各种连接Join详解

    最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL RIGHT JOIN、SQL FULL JOIN,其中前一种是内连接,后三种是外链接。 注释:INNER JOINJOIN是相同 ? INNER JOIN产生的结果集中,是1和2的交集。 注释:在某些数据库中,LEFT JOIN 称为LEFT OUTER JOIN ? 注释:在某些数据库中,RIGHT JOIN 称为RIGHT OUTER JOIN ?

    1.2K20

    相关产品

    • TDSQL MySQL 版

      TDSQL MySQL 版

      分布式数据库 TDSQL MySQL版是腾讯打造的一款分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。目前 TDSQL 已经为超过500+的政企和金融机构提供数据库的公有云及私有云服务,客户覆盖银行、保险、证券、互联网金融、计费、第三方支付、物联网、互联网+、政务等领域。TDSQL MySQL 版亦凭借其高质量的产品及服务,获得了多项国际和国家认证,得到了客户及行业的一致认可。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券