MySQL запрос зависает

У меня есть запрос 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

person user3182518    schedule 23.01.2017    source источник
comment
Вы использовали EXPLAIN?   -  person B001ᛦ    schedule 23.01.2017
comment
С уважением, вы не предоставили нам достаточно информации, чтобы помочь вам. Пожалуйста прочтите это. meta.stackoverflow.com/a/271056 Затем, пожалуйста, отредактируйте свой вопрос.   -  person O. Jones    schedule 23.01.2017
comment
Вы можете разместить здесь свою структуру стола?   -  person Haresh Vidja    schedule 23.01.2017
comment
У вас есть INDEX(EquipmentID) и INDEX(DateStamp)?   -  person Rick James    schedule 23.01.2017
comment
Что вы имеете в виду под зависанием?   -  person Rick James    schedule 23.01.2017


Ответы (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`;
person Community    schedule 23.01.2017
comment
Внимание: перемещение чего-либо с LEFT JOIN...ON на WHERE может изменить набор результатов. - person Rick James; 23.01.2017
comment
@RickJames, да, может, поэтому я написал, что вопрос не дает дополнительной информации по освещению. Нет информации о таблицах MySQL, используемых в запросе. Вы правы, говоря об этом. - person ; 23.01.2017
comment
@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)) - person ; 23.01.2017
comment
Может быть, f.value равно 1 или -1 в зависимости от того, начинается ли dd.Value с цифры? Выглядит странно, но вряд ли вызовет «зависание». - person Rick James; 23.01.2017
comment
@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)) - person ; 24.01.2017
comment
Давайте, как OP ответит на этот вопрос. Я дал хромой ответ 5 часов назад. - person Rick James; 24.01.2017
comment
@RickJames, по моему мнению (судя по синтаксису, используемому в LEFT JOIN) OP должен взглянуть на эти stackoverflow.com/questions/21791478/, dev.mysql.com/doc/refman/5.7/en/, dev.mysql.com/doc/refman/5.7/en/, percona.com/blog/2015/04/29/. - person ; 24.01.2017