SQL内连接性能建议

时间:2016-03-19 17:01:23

标签: mysql sql performance

我需要有关此sql语句的性能建议。我有两张桌子" cross" (约16 000行)和"数据" (约10万行)。问题是性能缓慢。我需要得到" title"来自" data"的列,其中data.partnum = cross.sku。问题是,我有多个相同的值" data.partnum",所以我需要的是将结果限制为仅来自内连接的第一行。我在select语句中尝试使用子查询,但速度很慢。你能帮助我吗?我是业余的数据库 - 所以我没有任何主键或索引键。感谢

SELECT '[cross]'
    , IFNULL(d2.title, "") as title
    , c2.maker
    , c2.partnum
    , c2.price
    , c2.sku
FROM `cross` c2
LEFT JOIN data d2 ON d2.partnum = c2.sku
WHERE 1=1
GROUP BY c2.partnum

1 个答案:

答案 0 :(得分:1)

这是您的查询:

SELECT '[cross]', COALESCE(d2.title, '') as title,
      c2.maker, c2.partnum, c2.price, c2.sku
FROM `cross` c2 LEFT JOIN
     data d2
     ON d2.partnum = c2.sku
WHERE 1=1
GROUP BY c2.partnum;

这显然表明了data(partnum, title)的索引。但是,查询存在几个大问题:

  • 什么是cross.skucross.partnum?奇怪的是join条件不在两个表中partnum上(或在两个表中都在sku上)。
  • 汇总的目的是什么?您没有聚合功能。
  • 我偏好COALESCE(),因为它是ANSI标准。

如果您想要任意匹配title,那么如果cross.partnum是唯一的,我会推荐相关子查询:

SELECT '[cross]',
       coalesce((select d2.title
                 from data d2
                 where d2.partnum = c2.sku
                 limit 1
                ), '') as title,
      c2.maker, c2.partnum, c2.price, c2.sku
FROM `cross` c2 
WHERE 1=1;

假设cross.partnum是唯一的(正如原始查询中缺少聚合函数所示),那么这应该快得多,索引在data(partnum, title)上。