MySQL left join 查询分析

原创 · 金汉江 · 2020-01-10

今天网站有人反馈很卡。我赶紧查询数据库SQL执行情况,因为之前运维给到有我们项目堆积了很多SQL慢查询,通过执行

mysql> show full processlit;

发现有多条这样一条SQL语句

SELECT 
    COUNT(*) AS `rows` 
FROM 
    `Customer` AS `a` 
LEFT JOIN 
    (SELECT * FROM `CustomerFollowUp` WHERE `groupId`=14) AS `cfu` 
ON 
    `cfu`.`customerId`=`a`.`id` 
WHERE 
    1=1 AND `a`.`id`>0;

我单独执行,用了0.863 秒

Customer 和 CustomerFollowUp是一对多的关系

后来修改了一下

SELECT 
    COUNT(*) AS `rows` 
FROM 
    `Customer` AS `a` 
LEFT JOIN 
    `CustomerFollowUp` AS `cfu` 
ON 
    `cfu`.`customerId`=`a`.`id` 
WHERE 
    1=1 AND `a`.`id`>0 AND `cfu`.`groupId`=14;

查询时间0.189 秒

但修改过的SQL,查询结果和原SQL结果可能是不一致的。

再次优化SQL

SELECT 
    COUNT AS `rows` 
FROM 
    `Customer` AS `a` 
LEFT JOIN 
    `CustomerFollowUp` AS `cfu` 
ON 
    `cfu`.`customerId`=`a`.`id` AND `cfu`.`groupId`=14 
WHERE 
    1=1 AND `a`.`id`>0;

执行时间0.186 秒

和最初SQL查询结果一致