TL; DR:
Onlar kendi yığının MySQL alt yukarıda her şey için önbelleğe alınan grafikler ile bir yığın yapısı kullanabilirsiniz.
Uzun cevap:
Onlar veri onların büyük miktarda işlemek ve hızlı bir şekilde nasıl arama Merak ettim çünkü ben bu kendimi biraz araştırma yaptım. İnsanların kullanıcı tabanı büyüdükçe yavaş olma özel yapılmış sosyal ağ komut şikayet gördüm. Bazı kendimi kıyaslama yaptım sonra sadece 10k kullanıcı ve 2,5 milyon arkadaş hatta grup izinleri ve beğeni ve duvar mesajlar hakkında rahatsız çalışmıyorum - - bağlantıları hızla bu yaklaşım kusurlu olduğu ortaya çıktı. Bu yüzden daha iyi nasıl yapılacağına ilişkin web'de arama biraz zaman geçirdim ve bu resmi Facebook makalesinde rastladım ettik:
Ben gerçekten önce okumaya devam yukarıdaki ilk bağlantının sunumunu izlemek için tavsiye ederiz. Muhtemelen FB bulabilirsiniz perde arkasında nasıl çalıştığını iyi açıklama bu.
Video ve makale birkaç şey söyler:
- Bunlar çok az MySQL kullanıyorsanız alt onların yığının
- Yukarıda DB SQL önbelleğe alma en az iki düzeylerini içerir ve bağlantıları tanımlamak için grafikler kullanan Tao tabakası vardır.
- Ben aslında kendi önbelleğe alınmış grafikler için kullandığınız yazılım / DB üzerinde bir şey bulamadı
en, arkadaş bağlantıları sol üst olan bu bir göz atalım:

De, bu bir grafiktir. :) O size değil nasıl SQL inşa etmek, orada bunu yapmak için çeşitli yollar vardır ama bu site farklı yaklaşımların iyi bir miktarda vardır. Dikkat: Bir ilişkisel veritabanı bunun ne olduğunu düşünün: Bu normalize verileri değil, bir grafik yapısı saklamak için düşünülüyor. Bu yüzden özel bir grafik veritabanı kadar iyi bir performans göstermez.
Ayrıca çevresindeki tüm yerleri filtrelemek istediğinizde örneğin arkadaş sadece arkadaş daha karmaşık sorgular, yapmak zorunda olduğunu düşünün bir koordinat verilen sen ve benzeri arkadaş arkadaşların. Bir grafik Burada mükemmel bir çözümdür.
Ben nasıl iyi bir performans böylece inşa etmek söyleyemem ama açıkça bazı deneme yanılma ve kıyaslama gerektirir.
İşte benim olduğunu hayal kırıklığı testi sadece arkadaş bulgular arkadaşlar:
DB Şema:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Arkadaş Sorgu arkadaşları:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
Gerçekten en az 10k kullanıcı kayıtları ile bazı örnek verileri oluşturmak için tavsiye ve bunların her en az 250 arkadaş bağlantısı olan ve daha sonra bu sorguyu çalıştırın. Benim makine (i7 4770k, SSD 16GB RAM) sonucu ~ 0.18 saniye konusu sorgu için. Belki de, bir DB deha değilim optimize edilebilir (öneriler bekliyoruz). Ancak, eğer bu ölçekler doğrusal sadece 100k kullanıcıları, 1.000.000 kullanıcıları için 18 saniye boyunca 1.8 saniyeye zaten.
Bu hala ~ 100k kullanıcıları için OKish ses ama arkadaş sadece getirilen arkadaşları ve yapmadığı düşünebilirsiniz "gibi herhangi bir daha karmaşık sorgu + I izin veya DEĞİL ediyorsam izni kontrolü yapmak izin arkadaşların arkadaşları bana göstermek Yalnızca yayınlar bunlardan bazılarını görmek için + ben hiçbirini sevdim kontrol etmek için bir alt sorgusu yapmak ". Sen zaten ya da değil bir yazı beğendiği veya kodda yapmanız gerekecek eğer DB çek üzerinde yapalım istiyoruz. Ayrıca, bu çalıştırmak sadece sorgu olmadığını düşünün ve sizin bir az ya da çok popüler sitesinde aynı anda etkin kullanıcıdan daha fazla olduğunu.
Ben cevabım Facebook çok iyi onların arkadaşları ilişki tasarlanan nasıl soru cevaplar düşünüyorum ama ben nasıl hızlı çalışacak şekilde bunu uygulamaya söyleyemem üzgünüm. IMHO - bir sosyal ağ uygulama kolay ama iyi performans açıkça olmadığından emin yapıyor.
Ben grafik-sorguları yapmak için OrientDB deneme ve altta yatan DB SQL benim kenarlarını haritalama başladık. Şimdiye kadar alırsanız ben bu konuda bir makale yazacağım yapılır.