SQL调优:小表驱动大表

问题产生

在性能测试中,发现有一个接口耗时在600-800ms之间,不满足200ms以内的性能要求,需要进行接口优化。

定位问题

用skywalking定位,接口调用耗时666ms,接口内部有一处sql查询耗时585ms,此SQL导致接口慢响应。 SQL分析

SELECT
        b.* 
FROM
        tableA a
        LEFT JOIN tableB b ON a.pull_no = b.pull_no 
WHERE
        1 = 1 
        AND b.kanban_no IN ('KB000001')
        AND a.STATUS IN (1,2) 
        AND a.factory = '1001' 
        AND a.workshop = 'AAA'; 

两张表的数据量都有200w。

问题分析

本次查询会采用Index Nested-Loop Join 执行流程 【在被驱动表有索引时选择】

备注:数据库常用JOIN算法 Index Nested-Loop Join,Simple Nested-Loop Join ,Block Nested-Loop Join,Batched Key Access

  1. 从表 A 进行where 条件过滤,此时数据量为100W,过滤条件并未大幅减少数据行

  2. 读取过滤后数据集每一行数据R

  3. 取出pull_no字段到表 B 里去查找;取出表 B 中满足条件的行,跟 R 组成一行ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剽悍一小兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值