2012-02-26 2 views
0

Я пытаюсь выяснить, как это сделать наиболее эффективным способом, учитывая, что у меня большие таблицы.Как эффективно подсчитывать события на mysql

У меня есть две таблицы: photos и favorites (думаю, что-то вроде Flickr или Facebook :-).

Для каждой фотографии P я хочу подсчитать общее количество избранных создателем P, полученным на ее фотографиях, до того, как она выложила P. Другими словами, я хочу, чтобы количество избранных было отправлено до момента, когда она поделилась P.

В таблице photos показаны столбцы: id, user_id, upload_timestamp.

В таблицу favorites включены столбцы: photo_id, user_id (пользователь favoriting), fave_timestamp.

Результирующий набор должен иметь следующие столбцы: photo_id, user_id (creator of the photo), pre_faves_count.

Таблица photos имеет 2 миллиона записей. favorites имеет 10 миллионов записей.

Я пытался сделать что-то вроде

select count(favorites) 
FROM favorites, photos 
WHERE favorites.photo_id 
    and photos.id 
    and favorites.fave_timestamp < photos.upload_timestamp 
group by favorites.photo_id, favorites.user_id 

- но я уверен, что это не правильно

+0

Какие индексы у вас есть? –

+0

У меня есть индексы на идентификаторе каждой таблицы. – amh

+0

Я пробовал делать что-то вроде select count (избранное) FROM 'избранное',' photos' WHERE favorite.photo_id и photos.id и избранное.fave_timestamp amh

ответ

1

Это будет очень медленно. Даже не пробуйте его на ваших таблицах 2M и 10M, без добавления индексов сначала:

SELECT 
     p.id    AS photo_id 
    , p.user_id   AS user_id 
    , COUNT(f.photo_id) AS pre_faves_count 
FROM 
     photos AS p 
    JOIN 
     photos AS allp 
      ON allp.user_id = p.user_id 
    LEFT JOIN 
     favorites AS f 
      ON f.photo_id = allp.id 
      AND f.fave_timestamp < p.upload_timestamp 
GROUP BY 
     p.id 
    , p.user_id 
+0

Спасибо. Я думаю, что я понял немного более быстрый способ сделать это: select photos.id, photos.user_id (выберите count (*) из избранных, где favorites.user_id = photos.user_id и избранное.fav_timestamp amh

+0

@andersmh: Вы хотите посчитать полученные вами голоса (мой запрос) или полученные вами голоса (ваш запрос, один Join менее нужен)? –

+0

ах, вы правы, мой запрос неверен :-) спасибо! – amh

Смежные вопросы