首页
学习
活动
专区
圈层
工具
发布

mysql 如何优化left join

今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:  select c.* from hotel_info_original...一般情况下参与联合查询的两张表都会一大一小,如果是join,在没有其他过滤条件的情况下MySQL会选择小表作为驱动表,但是left join一般用作大表去join小表,而left join本身的特性决定了...另外,我今天还明白了一个关于left join 的通用法则,即:如果where条件中含有右表的非空条件(除开is null),则left join语句等同于join语句,可直接改写成join语句。 ...拓展知识: 怎么查看mysql执行计划? 使用explain 关键字+需要执行的sql语句。...如:需要执行的sql语句是:select * from a where a.id = 10' 那么查看这个sql执行计划语句为:explain select * from a where a.id =

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

    MySQL之LEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论、一条评论有多少个赞等等。...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...原理 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...中没有有对应的行,则尝试用null补一行IF P2(lt,NULL) {// 补上null后满足 where 过滤条件t:=lt||NULL; // 输出lt和null补上的行} }}当然,实际情况中MySQL...num一班 4二班 0三班 0四班 0需求2由于在on条件中对左表限制,导致数据多余(其他班的结果也出来了,还是错的) 通过上面的问题现象和分析,可以得出了结论:在left join语句中,左表过滤必须放

    1.2K20

    【MySQL 系列】MySQL 语句篇_DQL 语句

    中 的 DQL 语句详解 2.1、DQL 语句:SELECT FROM SELECT FROM 语句用于从一个或多个表中检索数据,是 MySQL 中使用最多的语句。...如果有两条或更多条语句,则需要使用分号 “;” 将它们分开,以便 MySQL 单独执行每条语句。...MySQL 目前支持 4 种类型的连接:交叉连接(CROSS JOIN)、内联接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)。...以下是 MySQL 包含 JOIN 子句的 SELECT 语句语法: # LEFT JOIN 左关联,此时 a 表为主表,a、b 关联后的临时表中 a 表所有数据均存在 SELECT * FROM a...:①、ON 用来生成关联临时表,生成的临时表会将主表的所有记录保存下来,等待 WHERE 语句的进一步筛选;②、两表以上关联时需要用到多条 JOIN 语句,一般用 LEFT JOIN 确立唯一的主表。

    2.6K10

    【MySQL 系列】MySQL 语句篇_DML 语句

    1、MySQL 中的 DQL 语句 1.1、数据查询语言–DML DML(Data Manipulation Language),即数据操作语言,用于操作数据库对象中所包含的数据。...[WHERE clause]; 2、MySQL 中 的 DML 语句详解 2.1、DML语句:INSERT 在 MySQL 中,INSERT 语句用于将一行或者多行数据插入到数据表的指定列中。...2.2.3、使用 UPDATE 修饰符 在 MySQL 中, UPDATE 语句支持 2 个修饰符: LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行...DELETE t1 FROM t1 INNER JOIN t2 WHERE t1.id = t2.id; 以下语句在删除时使用 LEFT JOIN: DELETE t1 FROM t1 LEFT...2.3.6、使用 DELETE 修饰符 在 MySQL 中, DELETE 语句支持 3 个修饰符: LOW_PRIORITY: 如果你指定了 LOW_PRIORITY 修饰符,MySQL 服务器将延迟执行

    2.9K10

    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的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    2.6K10

    SQL语句进行left join时导致的索引失效案例

    之前的一篇文件中《分析MySQL中隐式转换导致查询结果错误及索引不可用》分析了MySQL中隐式转换导致索引不可用的问题,最近又遇到一个索引不可用的案例; 1、问题背景 最近在使用MySQL上面发现了这样一个问题...:MySQL两张表做left join时,执行计划里面显示有一张表使用了全表扫描,扫描全表近100万行记录,大并发的这样的SQL过来数据库变得几乎不可用了,今天和大家一起分享下这个问题的原因及解决办法,...(备注:MySQL版本为官方5.7.19) 2、问题重现 首先,创建测试表,表结构和表记录如下: root@localhost [wjqtest]>CREATE TABLE `wt1` (...关于MySQL字符集问题详细可参考: 深入理解MySQL字符集及校对规则(一) 深入理解MySQL字符集及校对规则(二) root@localhost [wjqtest]>alter table wt1...5、问题讨论 最后问一个问题,假设现在wt1和wt2表的字符集还未修改,如果上面那个问题SQL换一下left join表的位置(即把wt2 left join wt1换成wt1 left join wt2

    5.4K30

    SQL语句中 left join 后用 on 还是 where,区别大了!

    前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。...运行sql : select * from student s left join class c on s.classId=c.id order by s.id ?...在使用left join时,on 和 where 条件的区别如下: on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。...这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。...其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集

    1.5K10

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

    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS...这里Materialize with deduplication 的意思是,当第一次MYSQL需要这个子查询的结果的情况下,会将临时结果产生为一个临时表,当再次需要这个结果的时候会再次调用。...这样的好处有两个 1 可以尽量不进行语句的改写 2 可以重复的调用 这个功能本身 materialization=on 设置为ON 才能在查询中使用这个功能 mysql> SELECT @@optimizer_switch...如果要LEFT JOIN 中查询的结果与 EXIST IN 一致则可以在查询语句中加入group by 来去重。...group by fi.film_id) as t; 所以在撰写语句的时候,要明白 IN EXIST 和 LEFT JOIN 之间的区别,避免结果不是自己要的。

    2.6K50
    领券