【问题标题】:MySQL query hangingMySQL查询挂起
【发布时间】:2017-06-07 21:19:17
【问题描述】:

我有一个 mysql 查询,它运行但它只是挂起并且没有停止。我不确定查询在哪里中断。

SELECT
 TIMESTAMPDIFF(SECOND, '1970-01-01 00:00:00', f.Datestamp) AS Epoch,
 f.value AS `Usage`,
 q.Name AS Quantity,
 q.QuantityID,
 units,
 PrimeDataItem,
 dd.Description
FROM SourceChannels c
 JOIN UsageHhourly f ON c.ChanID = f.ChanID
 JOIN Quantities q ON c.QuantityID = q.QuantityID
 LEFT JOIN DigitalDescriptions dd ON ((c.DigitalDescriptionID = dd.DigitalDescriptionID)
 AND f.value = (CASE WHEN dd.Value REGEXP '^[0-9]' = 1 then dd.Value ELSE -1 END))
WHERE
 c.EquipmentID = 1496
 AND f.DateStamp >= '2016-12-28 00:00:00'
 AND f.DateStamp < '2017-01-04 00:00:00'
ORDER BY q.QuantityID, f.datestamp

【问题讨论】:

  • 你用过EXPLAIN吗?
  • 恕我直言,您没有提供足够的信息让我们帮助您。请阅读这个。 meta.stackoverflow.com/a/271056那么,请edit你的问题。
  • 你能把你的桌子结构放在这里吗?
  • 你有INDEX(EquipmentID)INDEX(DateStamp)吗?
  • “挂起”是什么意思?

标签: mysql query-performance


【解决方案1】:

这个问题没有提供更多启发性的信息。尝试更改您的查询,如下例所示。

SELECT
 TIMESTAMPDIFF(SECOND, '1970-01-01 00:00:00', `f`.`Datestamp`) AS `Epoch`,
 `f`.`value` AS `Usage`,
 `q`.`Name` AS `Quantity`,
 `q`.`QuantityID`,
 `c`.`units`,
 `c`.`PrimeDataItem`,
 `dd`.`Description`
FROM `SourceChannels` `c`
 INNER JOIN `UsageHhourly` `f` ON `c`.`ChanID` = `f`.`ChanID`
 INNER JOIN `Quantities` `q` ON `c`.`QuantityID` = `q`.`QuantityID`
 LEFT JOIN `DigitalDescriptions` `dd` ON `c`.`DigitalDescriptionID` = `dd`.`DigitalDescriptionID`
WHERE
`f`.`value` = IF((dd.Value REGEXP '^[0-9]'),1,-1)
 AND `c`.`EquipmentID` = 1496
 AND `f`.`DateStamp` BETWEEN '2016-12-28 00:00:00' AND '2017-01-04 00:00:00'
 ORDER BY `q`.`QuantityID`, `f`.`datestamp`;

【讨论】:

  • 警告:将某些内容从LEFT JOIN...ON 移动到WHERE 可能会改变结果集。
  • @RickJames 是的,它可以,这就是为什么我写这个问题没有提供更多启发信息。没有关于查询中使用的 MySQL 表的信息。你说得对。
  • @RickJames 我想你会同意这个查询中的失败部分是LEFT JOIN DigitalDescriptions dd ON ((c.DigitalDescriptionID = dd.DigitalDescriptionID) AND f.value = (CASE WHEN dd.Value REGEXP '^[0-9]' = 1 then dd.Value ELSE -1 END))
  • 可能f.value 是1 或-1,这取决于dd.Value 是否以数字开头?看起来很奇怪,但不太可能导致“挂起”。
  • @RickJames 你能解释一下OP试图用这部分实现什么吗? LEFT JOIN DigitalDescriptions dd ON ((c.DigitalDescriptionID = dd.DigitalDescriptionID) AND f.value = (CASE WHEN dd.Value REGEXP '^[0-9]' = 1 then dd.Value ELSE -1 END))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2019-06-15
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多