Kullanıcıların katılımı / aktivitesini Hesaplanması

5 Cevap php

Ben birden fazla MySQL sorguları kullanarak kullanıcıların katılımı / aktivitesini hesaplayan bir web sitesi var.

Tipik bir kullanıcı için ben soracaktır:

How many updates have they made? How many photos have they uploaded? etc etc.

Bunlar ilgili tablolar, güncellemeleri, fotoğrafları sadece temel COUNT sorguları vardır. Ben daha sonra bir puan almak için her COUNT değerleri toplamı. Her sorgu bir JOIN gerektirir ve her bir sorgu, her kullanıcı için toplam tüm 0.006 saniyede etrafında 0.0006 saniyede, 10 sorguları sürüyor.

O kadar kötü değil, bir kullanıcı için, ben 10 dakika teorik işlem süresi için 100.000 kullanıcıları ve bazı 1.000.000 DB sorguları için bu hesaplamak zorunda olsa. Ben yanlış bir şekilde sorunu yaklaşan ediyorum ve kimse herhangi bir fikirleri vardı merak edilmiş gibi hissediyor?

Ben kullanıcıların kullanıcı kaydı atar depolamak ve bunu belli bir eylemi gerçekleştirmek ama (ben geri gitmek ve örneğin belirli bir gününde tahakkuk kaç puan göremiyorum) gibi esnek değil, her zaman artan düşünmüştü.

Herhangi bir yardım büyük takdir!

5 Cevap

Her tablo bir tür user_id alanı vardır nerede tabloları yapılandırılmıştır varsayarsak, kullanıcıların yapmış toplam "faaliyetleri" almak için böyle bir şey yapabilirsiniz:

SELECT users.user_id, 
       (update_counts.update_count + photo_counts.photo_count) AS activity_count
FROM   users 
    INNER JOIN 
        (
        SELECT updates.user_id AS user_id, 
               COUNT(updates.*) AS update_count
        FROM   updates
        GROUP BY user_id
        ) AS update_counts ON users.user_id = update_counts.user_id
    INNER JOIN 
        (
        SELECT photos.user_id AS user_id, 
               COUNT(photos.*) AS photo_count
        FROM   photos
        GROUP BY user_id
        ) AS photo_counts ON users.user_id = photo_counts.user_id   
GROUP BY users.user_id

Açıkçası gereken gibi tabloları ekleyebilir ve sizin uygun gördüğünüz gibi şeyleri ağırlık olabilir. Her tabloda user_id alanda dizin varsa bu tabloları almak ne kadar büyük bağlı olsa o, oldukça iyi yapmalıdır.

Tablolarınızın büyük olsun, bir önbellek tabloda bir activity_count önbelleğe başlamak için ihtiyacımız olacak. Eğer gerekiyorsa elbette, tarih değerleri önbelleğe alabilir.

Sadece kaba bir tahmin gerekirse, (her gece, diyelim ki) bazı düzenli frekansta bu sorguyu çalıştırmak ve sonuçlarını önbelleğe olabilir; Bu bir önbellek tablosunu güncellemek için her tablo için tetikleyiciler yazarken daha az müdahaleci olurdu.

Bir user_activity bağlantı tablo var. Bir action_id, user_id ve timestamp alır. Bir kullanıcı bir fotoğraf gönderdiğinde Yani örneğin, bir rekor activity_id 2 (activities tablodan başvurulan 'fotoğraf yüklemesi için') =, {[(2) ile oluşturulan }] ve geçerli zaman damgası. Bu kolayca queryable bulunuyor ve kullanıcılara katrilyonlar olduğunda uzun süre çalışan sorguları endişe ortadan kaldırır.

Eğer bir 11 yolu katılmak yapmak istemiyorsan, ben her kullanıcı güncellemeden sonra eklemek bu amaç için ayrı bir tablo oluşturmak istiyorum.

Eğer siler ve böyle bir geribaşvuru var böylece tablo sadece kullanıcı adı, zaman damgası, bölüm (tablo o geliyor) ve diğer tablolardan benzersiz id içermelidir.

Eğer gerçekten gerekli olduğunda önce optimize etmek için çalışıyorlar sanki bana geliyor. 100.000 kullanıcıları yoksa gerektiğinde kadar bu konular hakkında endişelenmenize gerek yoktur.

Bunun üzerine sadece henüz gerekmez bir çözüm için sorunu overthink kalkmayın, optimize etmek için hiçbir neden yoktur söyleniyor.

Eğer hafif tutarsızlıklar yaşayabilirsiniz rağmen, onlar (memcached kullanarak) giriş yaptığınızda her kullanıcının sayımların sonuçlarını önbelleğe deneyebilirsiniz sadece önbelleği güncelleme ne zaman güncelleme sayar biri. Kullanıcının çok aktif ise sadece her saat ya da öylesine güncellemek için daha verimli olacaktır.

Bu uygulama için overkill olabilir, ama her zaman OLAP yol gidebiliriz. Bu tür kullanıcılar ve zaman açıklıklı gibi birden fazla boyutta öncesi toplanan önlemler, olmasını sağlayacak. Bu size raporlama ihtiyaçlarını çeşitli için esnek bir çerçeve sağlar. SQL Server Analysis Services paket firmamız için iyi çalıştı.