【问题标题】:MySQL Wrapping query with SELECT * is slow使用 SELECT * 的 MySQL 包装查询很慢
【发布时间】:2013-09-05 15:35:11
【问题描述】:

ORDER BY 让我的查询变慢。

在深入研究 StackOverflow 试图解决这个问题时,我发现了几个 references 用“SELECT *”包装一个查询。出于某种深不可测的原因,这也会使我的查询变慢。

我不明白以这种方式包装我的查询会有什么效果。 SELECT * FROM (QUERY) 不应该与 QUERY 相同吗?

这是我的查询:

SELECT W.NDB_No, Seq, Gm_Wgt*Nutr_Val/100
    FROM WEIGHT AS W,
    (SELECT NDB_No, Nutr_No FROM FOOD_DES, NUT ORDER BY nutrEnum) AS A
    LEFT JOIN 
    NUT_DATA AS B 
    ON A.NDB_No = B.NDB_No AND A.Nutr_No = B.Nutr_No;

需要 0.8 秒。用SELECT * FROM (...) AS X 包装这个查询会大大降低查询速度。这里发生了什么?此外,非常感谢您对 ORDER BY 工作的任何帮助(可能是相关问题)。请参阅 SQL Fiddle here

【问题讨论】:

  • 此查询中没有ORDER BY,是吗?
  • 一如既往 - 检查解释计划
  • @tadman:不,还没有,但这就是我要处理的地方。现在,我很困惑为什么用 SELECT * 包装查询会改变速度。我的意思是,这是同一个查询!
  • 这真的闻起来像糟糕的查询设计,会导致糟糕的查询性能。我敢打赌这是一个非常简单的查询,但是没有样本数据和预期的输出,就不可能理解你想用那个查询做什么。如果您还提供fiddle 我敢打赌这将在几分钟内解决
  • 删除内部的 ORDER BY。并考虑一下 CROSS JOIN 是否真的是您想要的。

标签: mysql


【解决方案1】:

这似乎是相同的结果,尽管顺序略有不同(因为未指定订购要求)http://sqlfiddle.com/#!2/69972/7

【讨论】:

  • 谢谢,草莓。这看起来很有希望,但是当我添加 ORDER BY 时它仍然很慢。也许缺少某些索引?
  • Nut_data 缺少 PK 并且 weight 似乎具有所需数量的 4 倍 - PK 应该足够了。除此之外,我们还有 CROSS JOIN,这对性能来说不是很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2016-01-10
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多