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

Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢

背景 最近一个后台功能列表,业务人员反馈查询和导出速度非常慢。 通过定位发现列表查询和数据导出都是使用的同样的一个连表查询SQL。...排查 通过Explain发现,连表查询中的table c没有使用到索引且是全表扫描。另外在Extra中特别说明了Using join buffer (Block Nested Loop)。...知识延伸 MySQL使用嵌套循环算法或其变种来进行表之间的连接。 在5.5版本之前,MySQL只支持一种表间关联方式,也就是嵌套循环(Nested Loop)。...如果关联的表数据量很大,那么join关联的时间会很长。在5.5版本以后,MySQL引入了BNL算法来优化嵌套循环。...于是,mysql5.5对这个算法进行了优化,新增了Index Nested-loop Join,Block Nested-loop Join

2.5K10

mysql各种join连接查询

最近项目用到了几次sql join查询 来满足银行变态的需求;正好晚上自学时,看到了相关视频,所以记录下相关知识,下次再用时,根据如下图片,便可知道 怎么写sql; 注意点: 在join操作中的 on...可以根据图表中的sql 语句进行相关join查询测试; 3.简单测试2个结果: 测试第一个join 语句如下: select student.student_id,sc.score from student...测试第二个join 语句如下:  select student.student_id,sc.score from student LEFT JOIN sc on student.student_id=sc.id...;解析:在 第一个语句的基础上加上 WHERE sc.id is null ;只保留sc.id 为 nul的数据,而这个数据 只有 student 和 sc 非交集部分才有; 重点为  mysql 没有...full outer join 或者 full join;导致 要想完成 图中的 6,7部分,必须使用 图中1和4 或 1和5 的 union 来实现; 测试第6个join 语句如下: select

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

    MySQL中的join查询

    前言 Mysqljoin是什么,join这个单词的意思是加入、参加、连接,而在数据库中,也是连接的意思,将两个表连接起来查询出我们想要的数据。...,假设A表有M条记录,B表有N条记录,全连接的时候就是笛卡尔积来计算的,所以查询出来的是是M×N条记录 [a2d38f0484cb3ece5d7261182c4cc8d2.png] 而test1和test2...两张表全连接的sql语句和查询的结果如下 SELECT * FROM test1 LEFT JOIN test2 ON test1.uid = test2.uid UNION SELECT * FROM...test1 RIGHT JOIN test2 ON test1.uid = test2.uid; [20210608203829563.png] 查询到两个表所有的数据,如果没有数据就为空 总结:查询到的内容是两个表的所有内容...SELECT * FROM test1 LEFT JOIN test2 ON test1.uid = test2.uid; [20210608204000983.png] 光看图好像跟只查询左表没什么区别

    4K11

    mysql longtext 查询_mysql中longtext存在大量数据时,会导致查询很慢

    使用explain: 有content时结果: mysql> explain select id, name, last_update_time from t order by last_update_time...无content的时候,查询走的是idx_last_update_time,我猜测这个索引中包含了id,name字段,因此仅通过索引就可以获取到所需的数据,因此速度很快。...我觉得,主要跟你的分页查询的方式有关,limit 10000,10 这个意思是扫描满足条件的10010条数据,扔掉前面的10000行,返回最后的10行,在加上你的表中有个,非常大的字段,这样必然增加数据库查询的...i/o时间, 查询优化你可以参照 @邢爱明 的 SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY...然后查询可以这样写: SELECT * FROM items WHERE last_update_time > “最后记录的值” order by last_update_time limit 0,10

    4.1K20

    MySQL很慢... 怎么破??

    老王:最近我的MySQL数据库很慢.... 很忧伤,这可肿么办? 帅萌:老王,老王你莫心慌,听我跟你唠~ MySQL性能有问题,先应该关注的是慢查询日志(slow log)。...MySQL性能慢,多半是SQL引起的(慢查询日志会把执行慢的SQL,一五一十的记录下来,就像你的身体一样诚实..)需要根据慢查询日志的内容来优化SQL。...其次,除了MySQL查询日志,还需要更多的关注liunx系统的指标和参数。 top 命令帮你观察大橘(局)。 ? 观察 load average 1分钟 、5分钟、 15分钟的平均负载值。...sy%系统内核使用的CPU占比,如果sy%太高,要注意MySQL的连接数和锁等信息。...如果发生了内存泄漏,解决方案: 重启MySQL 。 升级到最新的小版本MySQL 。 还可以通过vmstat 来观察每秒的进程、内存、swap、io、cpu等详情情况。 ?

    5.3K30

    为什么推荐MySQL不使用join查询

    1.对于mysql,不推荐使用子查询join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据。...查询id集的时候,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效。 可以减少冗余记录的查询。...当表处于百万级别后,join导致性能下降; 2.分布式的分库分表。这种时候是不建议跨库join的。目前mysql的分布式中间件,跨库join表现不良。...四、不使用join的解决方案 在业务层,单表查询出数据后,作为条件给下一个单表查询。也就是子查询。会担心子查询出来的结果集太多。mysql对in的数量没有限制,但是mysql限制整条sql语句的大小。...五、join查询的优势 关联查询的好处是可以做分页,可以副表的字段做查询条件,在查询的时候,将副表匹配到的字段作为结果集,主表去in它。

    87710

    mysql join关联查询需注意的问题

    3. join优化 小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数; 优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都能在整个循环中提升很大的性能...; 对被驱动表的join字段上建立索引; 当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size。...什么是Join Buffer Size 什么是Join Buffer? Join Buffer会缓存所有参与查询的列而不是只有Join的列。...可以通过调整join_buffer_size缓存大小 join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL 5.1.22版本前是4G-1,而之后的版本才能在...在进行block_NEST_loop_join 算法的时候会将驱动表和 被驱动表查询到的数据放入到一个内存块中(JOIN buffer size) 其初始内存大小为256K 这个东西也可以进行设置)当查询到的数据比较打的时候会进行分块存储

    1.4K50

    sql连接查询(inner join、full join、left join、 right join

    sql连接查询(inner join、full join、left join、 right join) 一、内连接(inner join) 首先我这有两张表 1、顾客信息表customer ?...注意:顾客与订单之间是一对多关系 需求:查询哪个顾客(customer_name)在哪一天(create_time)消费了多少钱(money) sql语句: select c.customer_name...内连接的过程: 将符合条件的记录组合起来,放在一张新表里面 二、左连接(left join) 需求:查询哪个顾客(customer_name)在哪一天(create_time)消费了多少钱(money)...从结果可以很清楚的明白左连接的含义: 将左边表的所有记录拿出来,不管右边表有没有对应的记录 三、右连接(right join) 需求:查询哪个顾客(customer_name)在哪一天(create_time...、 从结果可以很清楚的明白右连接的含义: 将右边表的所有记录拿出来,不管右边表有没有对应的记录 四、全连接(full join) 这里要注意的是mysql本身并不支持全连接查询,但是我们可以使用UNION

    4.3K40

    为什么MySQL不推荐使用子查询join

    来源:cnblogs.com/liboware/p/12740901.html 1.对于mysql,不推荐使用子查询join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据...查询id集的时候,使用IN()代替关联查询,可以让MySQL按照ID顺序进行查询,这可能比随机的关联要更高效。 可以减少冗余记录的查询。...当表处于百万级别后,join导致性能下降; 2.分布式的分库分表。这种时候是不建议跨库join的。目前mysql的分布式中间件,跨库join表现不良。...四、不使用join的解决方案 在业务层,单表查询出数据后,作为条件给下一个单表查询。也就是子查询。会担心子查询出来的结果集太多。mysql对in的数量没有限制,但是mysql限制整条sql语句的大小。...建议在业务上做好处理,限制一次查询出来的结果集是能接受的。 五、join查询的优势 关联查询的好处是可以做分页,可以副表的字段做查询条件,在查询的时候,将副表匹配到的字段作为结果集,主表去in它。

    4.1K30

    mysql join

    首先先放张图 今天聊聊mysqljoin连接,其本质是拿主表每条数据取出来和子表每行数据进行循环比较,如果满足则返回,不满足返回null 首先是内连接 两者之间取交集,两边都满足返回,不满足不返回...JOIN 然后是左外连接 左外连接,此时可以理解为理解 左表为主表,右表为子表。...sp_user b ON a.seller_id = b.seller_id WHERE b.seller_id IS NULL 还有一种是全外连接 全外连接是内联结果和不满足条件的行 mysql...不支持全外连接语法,所以我们UNION实现全外连接 SELECT * FROM sp_user a LEFT OUTER JOIN tb_seller b ON a.seller_id = b.seller_id...需要 join 的字段,数据类型必须绝对一致;多表关联查询 时,保证被关联的字段需要有索引。

    60610

    SELECT STRAIGHT_JOIN优化join查询技巧

    在优化join查询的过程中 需要理解MySQL对多表连接的处理方式,首先MySQL优化器要确定以谁为驱动表,也就是说以哪个表为基准,在处理此类问题时,MySQL优化器采用了简单粗暴的解决方法:哪个表的结果集小...,就以哪个表为驱动表,当然MySQL优化器实际的处理方式会复杂许多。...MySQL优化器选择小表作为驱动表,但是当我们的排序字段是在大表里,于是乎不可避免的出现了「Using filesort」,「Using temporary」 这样效率会慢很多 当使用inner join...时,我们可以使用 SELECT STRAIGHT_JOIN xxx字段,xxxx字段 ,来强制使用左边的表作为主表,这样就能应用到索引了 默认速度很慢,是这样的

    78320

    mysql中多个left join查询写法以及别名用法

    od.reportSendOrderLogisticId,             od.reportDownloadPath         FROM             orders.order_detail od  LEFT JOIN...orders.order_logistics ol ON od.recieveOrderLogisticId = ol.id     LEFT JOIN orders.product_snapshot...) a LEFT JOIN (     SELECT         ol.trackNumber,         od.id     FROM         orders.order_detail...od     LEFT JOIN orders.order_logistics ol ON od.reportSendOrderLogisticId = ol.id     WHERE         ...) b ON a.id = b.id ps:解释下 对于Mysql中的语句,牵扯到左查询时  可以left join关联  但一般对于不知道什么时候起别名 什么时候括号的老铁们 真实头疼  所以发个模板

    2.9K30

    Mysql - join 优化

    MMR 解决的不是 join 优化,而是回表优化:   mutil-range read , 正如他的名字一样,优化的是离散范围的读,具体是优化在 主键上离散范围的读   如果是从辅助索引读取符合条件的...优化:   Batch Key Access ,正和她的名字一样,是批量的一堆主键 去 读取主键索引。  ...)情况下用不上的 join buffer,每读一行驱动表,就将连接字段放入 join buffer   然后将 join buffer 传给 MMR ,MMR 负责 去连接字段对应的被驱动表的辅助索引上读取主键...,并且放到 read_rnd_buffer ,然后排序,再去被驱动表的主键索引读取行数据 大表 join 对内存的影响:   如果被驱动表是 大表,驱动表也比较大,能被分成几个 join buffer,...临时表作为被驱动表

    66020

    MySQL - Join关联查询优化 --- NLJ及BNL 算法初探

    Extra 中 的Using join buffer (Block Nested Loop)说明该关联查询 ---- 执行过程 把 t2 的所有数据放入到 join_buffer 中 把表 t1 中每一行取出来...虽然BNL也是100万,但是是内存中计算 ,肯定要快 所以,BNL磁盘扫描次数少很多,相比于磁盘扫描,BNL的内存计算会快得多。...因此MySQL对于被驱动表的关联字段没索引的关联查询,一般都会使用 BNL 算法。...---- 关联sql的优化的两个核心点 关联字段加索引,让mysqljoin操作时尽量选择NLJ算法 小表驱动大表,写多表连接sql时如果明确知道哪张表是小表可以straight_join写法固定连接驱动方式...因为left join,right join已经代表指定了表的执行顺序 尽可能让优化器去判断,因为大部分情况下mysql优化器是比人要聪明的。

    1.5K20

    MySQL--什么情况下不建议使用join查询

    关于join 当需要查询两个表的交集、并集等数据时,除了嵌套子查询的方式外,还可以使用join的方式提升性能。对于MySQLjoin语句,需要两个最基础的“角色”:主表即驱动表,关联表即驱动表。...MySQL有三种关联逻辑处理策略,分别为:Index Nested-Loop Join、Simple Nested-Loop Join、Block Nested-Loop Join。...Index Nested-Loop Join 索引嵌套循环连接,MySQL选择驱动表与被驱动表关联逻辑之一。...假设被驱动表共N行数据,对于Index Nested-Loop Join来说,在查询被驱动表的数据时,会使用二分法进行查找,即时间复杂度为:O(logN),由于每次在被驱动表查一行数据,要先搜索索引再回表搜索...图片引用自极客时间《MySQL实战45讲》。 能不能使用join语句?

    25020
    领券