mysql - SQL 内连接性能建议

标签 mysql sql performance

我需要有关此 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.skucross.partnumjoin条件在两个表的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/

相关文章:

php - WordPress 选择计数查询优化

php - 使用单个值从mysql中的多个表中删除多行

php - 突然密码列抛出: SQLSTATE[42S22]: Column not found

php - mysql_pconnect 与 odbc_connect (PHP)

ASP.NET Formview 未正确更新 SQL 数据库

sql - 从 postgres 数据库中删除数据

mysql - 在 ALTER_PROCEDURE DDL 触发器中获取过程名称

mysql - 如何优化mysql查询

php单选按钮自动更新数据库表

performance - X86 64 位模式下的索引分支开销