Bir arkadaşım için benim mysql sorguları büyük bir DB beslenmek nasıl yapılır?

1 Cevap php

İşte benim mysql tablo düzenidir;

  1. Durum tablo / / StatusId, kullanıcı kimliği, tarih, konu, tarih vardır
  2. comment table // holds commentID, userID who posted, date, and statusID that it belongs too
  3. user table //holds userID username and user photo URL

Yukarıdaki bu tablo düzeni ile, ben bunu yapmam gerek;

  1. DB sorguları az miktarda hızlı
  2. Arkadaşım listesindeki bir kullanıcının yayınlanan bir sayfadaki tüm durum girdileri göster (5.000 arkadaşlarına kadar olabilir)
  3. show all comments for each status entry under the appropriate blog
  4. show a username/photo URL for every status entry post
  5. show a username/photo URL for all comment posters next to there comment

Sonra ben sonuç myspace ya da sadece sadece ARKADAŞ tüm yazı / eylemleri ya da her neyse gösterecektir Facebook'a benzer.

Hatta benim bir statü yazı olarak yazı ve bu sayfadaki tüm cevapları düşünün, Ben başarmak için çalışıyorum ne yığın taşması üzerine bu sayfayı karşılaştırabilirsiniz durumu yazılan olacaktır, bu sayfadaki tüm cevaplar altında, her birinin altında yorumlarınızı gösterir ve hepsi kullanıcı bilgisi var, o kadar çok katılır ve malzeme olmadan bunu gerçekleştirmek için daha iyi bir yolu var mı?

Question 1
Is there anyway better to accomplish what I need? This is not really fast enough when there are millions of rows that it searches through even with indexes, what are my options?

Question 2
Is it possible to modify this to just show the first X ammount of comments on each status post? And if so, would that speed it up since it wouldn't have to search through as many comments?

Arkadaşım Listesi sorguda zaten Aşağıda, bunun nedeni bu yüzden 1 daha az sorgu olacak ben bir diziye arkadaş listesi almak ve memcache veya APC önbellekte saklamak için planı

Here is my query

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) Ben kısa sürede bana izin verir gibi bu bir lütuf başlayacak

1 Cevap

Sizin katılmak iki farklı değerlere eşit olması aynı alanda dayalı, bu yüzden hiç memnun olamaz

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

Sen İKİ kullanıcı tabloya katılır gerekir

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