mysql birleştirmeler ile yardıma ihtiyacı

1 Cevap php
Users table
 user_id
 pic_url
 name

friends table
 auto_id
 userid
 friendid
 status

actions table
 auto_id
 userid
 type
 subject
 body
 datetime

Ben, güncellemeler thats bir arkadaşı akışı güncellemeleri gösterir yapmak için bir blog yazısı, durum değişikliği, her şey olabilir ancak kullanıcı oturum açmış bir arkadaş olanları göstermek gerekir istiyorum

İşte bunu yapmanın daha iyi bir yolu, orada ben ile geldi budur ama benim userbase nedenle performans bir zorunluluktur çok büyük? Lütfen göster

SELECT u.user_id, u.pic_url, u.name, a.auto_id, a.userid, a.type, a.subject, a.body, a.datetime
FROM actions AS a
LEFT JOIN users AS u ON u.auto_id=a.userid
LEFT JOIN friends AS f ON f.userid=a.userid
WHERE f.friendid=1 //1 would be my user ID 
AND f.status=active

Ben bu doğru olduğunu sanmıyorum yardımcı olun.

Orada 50.000 kullanıcı ve benim kimliği # 1 ve ben 20.000 kullanıcılar ile arkadaş olduğum Diyelim ki, ben arkadaş olduğum bir kullanıcı tarafından yayımlanan eylemleri tablosundaki tüm girişleri dönmek gerekir, ayrıca kendimden eylemleri dahil etmek değiştirmek gerekir

Böyle bir şey mümkün burada hızlı olurdu aramaları için karma tablo çeşit kullanma hakkında bazı insanlar talki duymuş?

Herhangi bir yardım için teşekkür ederiz

1 Cevap

I have heard some people talki about using some sort of hash table for faster lookups would something like that be possible here?

Bir index denir, ve size bir JOIN (veya >, >=, =, <=, < gibi açık bir kısıtlaması veya {[(2) ile eşleşen kullanarak planlıyorsanız, her sütuna bir eklemek gerekir Bir belirtilen listede yalnızca öğeler) maçları]} fıkra. Bu şekilde veritabanı sunucusu yerine tablo tüm satırları ile bir kaba kuvvet arama yapmak yerine, endekste doğru girdileri doğru atlayabilirsiniz. Bu tam bir kitapta dizin gibi. Eğer isim "Knuth" göründüğü bir kitapta sayfaları bulmak istiyorsa, iki seçeneğiniz var. Kitap bir dizin varsa, dizin bakmak ve isim olduğunu umuyoruz. Kitap bir dizin yoksa, sadece her şeyi kendiniz üzerinden okumak gerekecek ve o kadar uzun sürer.

Eğer sıralama / sipariş (ya da göreli sayısal / dize karşılaştırma her türlü yapıyor) önem veriyorsanız, bu sıralanmış bir dizin olmalıdır. Aksi takdirde satır dolu tablolar için daha hızlıdır, ancak sıralama bilgi taşıyan bir hashtable dizin olabilir. Ayrıntılar bu tür veritabanı sunucu yazılımı türü kullanıldığı bağlı olarak farklı sözdizimi / seçenekler olması muhtemeldir. ** (Aşağıdaki nota bakınız)

Eğer kendiniz bir tane eklemek zorunda kalmazsınız birincil anahtarlar zaten otomatik olarak oluşturulan bir indekse sahip olduğunu unutmayın. Not Ayrıca bir çoklu-sütun birincil anahtar varsa, örneğin (Devlet, Şehir, Posta Kodu) sonra etkili örneğin, birincil anahtarın sol alt kümeleri endeksleri olacak ücretsiz bir Devlet üzerinde dizin ve (Devlet, Şehir) ve (Devlet, Şehir, Posta Kodu) olsun, ama sen sinde Posta Kodu veya Şehir veya (City, sinde Posta Kodu) JOIN istiyorsanız o zaman kendi endeksleri oluşturmanız gerekir Birincil anahtar tarafından sağlanan ek olarak.

Bu sütunlarda indeksine sahip olmalıdır gibi bir durumda, (Ben varsayarak yaşıyorum sütunları *-ed zaten birincil anahtarlar ettik) görünüyor. Eğer kullanıcı kimliklerinin sayısal sırasına herhangi bir önemi yoksa, o hashtable'a endeksleri için iyi bir aday olurdu.

Users.user_id*
Friends.user_id
Friends.friend_id
Friends.active
Actions.user_id


** MySQL için, CREATE INDEX statement bir hashtable dizin için HASH KULLANARAK, ya da bu mekansal veri olarak ... RTREEs görmezden (sıralı bir dizin için) btree KULLANMA diyor ki bir madde ekleyin. MySQL ortak depolama motorları InnoDB ve MyISAM üzerinde HASH endeksleri izin vermediğini de unutmayın. Yüksek performansa ihtiyaç gerçekten büyük veri setleri olasılıkla veri bir HASH endeksi ile bir bellek masada yansıtılmış olması gerekir. 50.000 satır ile muhtemelen bu konuda endişelenmenize gerek yok; HASH (1) O olduğunu ve çok fark muhtemelen orada değil oysa btree arama süresi O (log n) 'dir. BTREEs çok geniş ve derin olmamak tasarlanmıştır; arama adımda tek bir ek karşılaştırma gerektiren, 10 veya 100 bir faktör tarafından satır # artırmak gerekebilir.