Mysql Вложенный запрос с подсчетом сумм, как правильно?

dmvlad

Новичок
Есть не замысловатая таблица, в которой надо вывести все записи с id=0, а к ним прикрепить сумму столбцов дочерних id.

Таблица такая
Код:
CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `countTime` mediumint(9) NOT NULL DEFAULT '0',
  `originalMessageID` int(12) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  AUTO_INCREMENT=2812 ;
Делаю таким запросом
PHP:
SELECT m.*,
    (SELECT SUM(countTime) FROM `messages` WHERE
            originalMessageID = m.id) as allTime
FROM `messages` m WHERE m.originalMessageID = '0'
Но беда в том, что он больше 8 секунд работает, хотя строк всего 300, а всего в таблице записей менее 3000.

Как бы ускорить выгрузку?
 

dmvlad

Новичок
А если посчитать к сумме еще и количество связанных строк, то больше 18 секунд считает:

Код:
SELECT m.id,
    (SELECT SUM(countTime) FROM `messages` WHERE
            originalMessageID = m.id) as allTime,
           
        (SELECT count(*) FROM `messages` mm WHERE
            mm.originalMessageID = m.id ) as qty

FROM `messages` m
WHERE m.originalMessageID = '0'
 

Breeze

goshogun
Команда форума
Партнер клуба
1. сделай индекс на originalMessageID
2. SUM и count можно делать по одному полю countTime в одном подзапросе, а не разбивать на два, если сам запрос компоновать по-другому
3. при проблемах всегда смотри explain запроса и показывай его на форумах
4. можно использовать group by :D что не отменяет первые три пункта
 
Последнее редактирование:

dmvlad

Новичок
1. сделай индекс на originalMessageID
2. SUM и count можно делать по одному полю countTime в одном подзапросе, а не разбивать на два, если сам запрос компоновать по-другому
3. при проблемах всегда смотри explain запроса и показывай его на форумах
4. можно использовать group by :D что не отменяет первые три пункта
Спасибо, про Индекс даже не подумал, а уже после него время на запрос стало уходить 0,02 сек!
 
Сверху