我需要有关此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
答案 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.sku
和cross.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)
上。