问题产生
在性能测试中,发现有一个接口耗时在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
-
从表 A 进行where 条件过滤,此时数据量为100W,过滤条件并未大幅减少数据行;
-
读取过滤后数据集每一行数据R
-
取出pull_no字段到表 B 里去查找;取出表 B 中满足条件的行,跟 R 组成一行ÿ