我需要有关此 sql 语句的性能建议。我有两个表“交叉”(大约 16 000 行)和“数据”(大约 100 000 行)。问题是性能缓慢。我需要从“数据”中获取“标题”列,其中 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
最佳答案
这是您的查询:
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,标题)
。
关于mysql - SQL 内连接性能建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104548/