Оптимизировать SQL-запрос - PullRequest
4 голосов
/ 21 февраля 2009

У меня следующий запрос:

Select diary_id, 
   (select count(*) 
    from `comments` as c 
    where c.d_id = d.diary_id) as diary_comments 
From `diaries` as d

Это занимает много времени (около 0.119415 в моем случае). Как сделать это быстрее?

Я вижу только один способ: сделать дополнительный запрос для номера комментария для каждой строки из моего основного запроса Но это будет что-то вроде выполнения запросов в цикле. Что-то вроде:

while ($r = mysql_fetch_array($res))
{
   $comments = mysql_query("select count(*) from `comments` where d_id = ".$r['diary_id']);
}

Я думаю, что это плохая стратегия. Любой другой совет?

Ответы [ 3 ]

9 голосов
/ 21 февраля 2009
SELECT d.diary_id, count(c.d_id) as diary_comments 
FROM diaries d
LEFT OUTER JOIN comments c ON (d.diary_id = c.d_id)
GROUP BY d.diary_id

Я, кажется, был опущен, потому что вы можете получить все необходимые данные только из таблицы дневников. Я предположил, что это упрощенный пример, и в действительности потребуются другие поля из таблицы дневников, также этот метод возвращает записи, которые не имеют комментариев. Если вам не нужна ни одна из этих двух вещей, я бы пошел с другим ответом.

1 голос
/ 22 февраля 2009

Определенно плюс один для решения tomhaigh , в этой ситуации именно группа является именно тем.

Еще один вариант, о котором всегда стоит помнить: у вас есть два варианта. Во-первых, чтобы вычислить значение при каждом чтении, а во-вторых, чтобы вычислить его при каждой записи и сохранить результат. Во втором случае вам понадобится дополнительное поле в дневниках с именем comments_count, которое нужно будет увеличивать при добавлении нового комментария. Очевидно, что это может быть менее точно, чем подсчет количества при каждом чтении, и замедлит ваши записи. Но если производительность чтения снижается, а записи заметно реже, чем чтение, тогда это может быть удобным способом решения проблемы.

1 голос
/ 21 февраля 2009

Похоже, у вас есть все необходимые данные в таблице комментариев, поэтому я не вижу причин для объединения или подзапроса.

SELECT d_id AS diary_id, COUNT(*) AS diary_comments
FROM `comments`
GROUP BY d_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...