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

mysql 如何优化left join

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:  select c.* from hotel_info_original...h.hotel_id is null     这个sql是用来查询出c表中有h表中无的记录,所以想到了left join的特性(返回左边全部记录,右表不满足匹配条件的记录对应行返回null)来满足需求...一般情况下参与联合查询的两张表都会一大一小,如果是join,在没有其他过滤条件的情况下MySQL会选择小表作为驱动表,但是left join一般用作大表去join小表,而left join本身的特性决定了...那么如何优化left join:  1、条件中尽量能够过滤一些行将驱动表变得小一点,小表去驱动大表  2、右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上...拓展知识: 怎么查看mysql执行计划? 使用explain 关键字+需要执行的sql语句。

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

    MySQL窗口函数怎么

    avg_score FROM scores GROUP BY subject) sub ON s1.subject = sub.subjectORDER BY s1.score DESC; 这段SQL是干什么的呢...很早以前 Oracle 和 MS SQL 的时候会用到里面的窗口函数,但是 MySQL 后才发现,MySQL 竟然没有窗口函数,以至于一些负责的统计查询都要用各种子查询、join,层层嵌套,看上去很简单的需求...窗口函数主要的应用场景是统计和计算,例如对查询结果进行分组、排序和计算聚合,通过各个函数的组合,可以实现各种复杂的逻辑,而且比起 MySQL 8.0之前子查询、join 的方式,性能上要好得多。...score) as `累加分数` FROM scores;得到的结果:namesubjectscore累加分数Student9数学4545Student6化学58103Student4数学68171我们看这是怎么算出来的...s1LEFT JOIN scores s2 ON s1.score < s2.scoreGROUP BY s1.name, s1.subject, s1.scoreORDER BY s1.score

    9310

    MySQLLeft Join 避坑指南

    链接 | segmentfault.com/a/1190000020458807 现象 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论...SELECT c.name, count(s.name) as num FROM classes c left join students s on s.class_id = c.id...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...根源 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...IF P2(lt,NULL) {// 补上null后满足 where 过滤条件 t:=lt||NULL; // 输出lt和null补上的行 } } } 当然,实际情况中MySQL

    1.1K20

    MySQLLEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论、一条评论有多少个赞等等。...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...原理 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...从这个伪代码中,我们可以看出两点:1、右表限制ON如果想对右表进行限制,则一定要在on条件中进行,若在where中进行则可能导致数据缺失,导致左表在右表中无匹配行的行在最终结果中不出现,违背了我们对left...如果所谓的小表在内存中放不下怎么办?我2个只有几条记录的表做关联查询,这应该算是小表了,在查看reduce的执行日志时依然是有写磁盘的操作的。

    89820

    sql LEFT JOIN RIGHT JOIN(左连接)(mysql

    在这里,LEFT JOIN(内连接,或等值连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录。...并不存在2134,那么这个值就不会查询出来: 再假设,如果table1中有age1的值2,3,4但是table2中没有一个age1的值是2,3,4那么table1中就会显示出来2,3,4;换句话说,使用left...SELECT * FROM table1 LEFT JOIN table2 ON table1.age1 = table2.age1;在这里使用 结果如下: ?...那么RIGHT JOIN 正好相反:与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。...这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    1.9K10

    mysql的count统计查询到底要怎么mysql

    where,它可以直接取到结果,因为它可以利用存储引擎的特性直接获得这个值,比如count(*) 3,统计列时,如果知道这个列不能为空,会转化为count(*),从而加快速度 所以:你要知道自己要干什么,该怎么样去...在无可用的二级索引情况下,执行count会使MySQL扫描全表数据,当数据中存在大字段或字段较多时候,其效率非常低下(每个页只能包含较少的数据条数,需要访问的物理页较多) 三、实际应用 1,50万条数据...,没有索引,大约耗时13分钟 2,50万条数据,有索引,大约耗时354毫秒 3,原理 mysql一个数据页为:16k(默认) 能存16*1024/(4+8) =1365条数据(为什么是4+8可以看看mysql...存储页的原理) 假设每页数据耗损不存满,50% 50万条数据,需要500000/1365*2 为 732个物理页 大小为16k*732为11.4M mysql空间按区分配,一区1M,假设连续的话,需要连续读

    3.3K20

    MYSQL IN EXISTS LEFT JOIN 结果不同的问题?

    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS...这个问题的从下面的这个SQL 来开始,这是一个典型的说复杂不复杂,说写的好,写的不怎么好的一个SQL。...这里Materialize with deduplication 的意思是,当第一次MYSQL需要这个子查询的结果的情况下,会将临时结果产生为一个临时表,当再次需要这个结果的时候会再次调用。...通过给临时表散列表对表进行索引,索引为唯一索引去除重复值。...and fa.film_id = 2; 上面的三个SQL 看上去要表达一个目的,实际上从结果上看,1 2 SQL 的结果是一致的,第三个 LEFT JOIN 表达的SQL 的结果和前两个不一样。

    1.8K50
    领券