Как сделать мои MySQL запросы для подачи в друзья на большой БД? - PullRequest
1 голос
/ 08 августа 2009

Вот моя схема таблицы MySQL;

  1. таблица состояния // имеет идентификатор статуса, идентификатор пользователя, дату, тему, дату
  2. таблица комментариев // содержит commentID, идентификатор пользователя, который разместил, дата и statusID что оно тоже принадлежит
  3. таблица пользователей // содержит имя пользователя userID и URL фотографии пользователя

С приведенной выше схемой таблицы мне нужно сделать это;

  1. Быстро с наименьшим количеством запросов к БД
  2. Показать все записи статуса на странице, опубликованные пользователем в моем списке друзей (может быть до 5000 друзей)
  3. показать все комментарии для каждого статуса запись под соответствующим блогом
  4. показывать имя пользователя / фото URL для каждого статус записи поста
  5. показать имя пользователя / фото URL для всех коментарии рядом с там комментарий

Результат, к которому я стремлюсь, похож на myspace или facebook, где он будет показывать все сообщения / действия или что-либо еще только от ваших ДРУЗЕЙ.

Вы можете даже сравнить ЭТУ страницу при переполнении стека с тем, что я пытаюсь выполнить, посчитать мой пост статусным постом, и все ответы на этой странице будут статусными постами, тогда под всеми ответами на этой странице будут показаны комментарии у каждого из них есть информация о пользователе, есть ли лучший способ сделать это без такого количества соединений и прочего?

Вопрос 1
Есть ли способ лучше выполнить то, что мне нужно? Это не достаточно быстро, когда миллионы строк просматриваются даже с индексами. Какие у меня варианты?

Вопрос 2
Можно ли изменить это так, чтобы он отображал только первое количество комментариев X в каждом статусном сообщении? И если да, то ускорит ли это, так как не нужно будет искать столько комментариев?

Ниже список друзей уже находится в запросе, причина в том, что я планирую поместить список друзей в массив и сохранить его в кэше памяти или кэше APC, чтобы он был на 1 меньше запроса

Вот мой запрос

SELECT s.statusid, s.userid, s.statustype, s.subject, 
     s.datetime, c.commentid, c.statusid, c.userid, 
     c.comment, c.datetime, su.disp_name, 
     su.pic_url, cu.disp_name, cu.pic_url
FROM teststatus AS s
   LEFT JOIN teststatuscomments AS c 
       ON s.statusid = c.statusid
   LEFT JOIN friend_reg_user AS su
       ON su.auto_id = s.userid
   LEFT JOIN friend_reg_user AS cu
       ON cu.auto_id = c.userid
WHERE s.userid =1 OR s.userid
       IN ( 2, 3, 4, 5, 6, 7, 8, 9, 
            10, 11, 12, 13, 14, 15, // Remember this list of friend ID's
            16, 17, 18, 19, 20 )  //can be from any ammount of ID's  up to 5,000
ORDER BY s.statusid

PS) Я начну вознаграждение за это, как только оно позволит мне

1 Ответ

3 голосов
/ 08 августа 2009

Ваше объединение основано на том же поле, равном двум разным значениям, поэтому оно никогда не может быть удовлетворено

 ON fru.auto_id = s.userid
          AND fru.auto_id = c.userid 

Вам нужно ДВА объединения в пользовательскую таблицу

SELECT s.statusid, s.userid, s.statustype, s.subject, 
     s.datetime, c.commentid, c.statusid, c.userid, 
     c.comment, c.datetime, su.disp_name, 
     su.pic_url, cu.disp_name, cu.pic_url
FROM teststatus AS s
   LEFT JOIN teststatuscomments AS c 
       ON s.statusid = c.statusid
   LEFT JOIN friend_reg_user AS su
       ON su.auto_id = s.userid
   LEFT JOIN friend_reg_user AS cu
       ON cu.auto_id = c.userid   -- EDIT 
WHERE s.userid =1OR s.userid
       IN ( 2, 3, 4, 5, 6, 7, 8, 9, 
            10, 11, 12, 13, 14, 15, 
            16, 17, 18, 19, 20 ) 
ORDER BY s.statusid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...