2012-04-12 19 views
5

Şu anda her görünümü veritabanında kullanıcı IP'si, görüntüleme tarihi vb. Ile saklıyorum. Ancak, benimki web sitesinin çok sayıda isabeti var ve veritabanı kilitleme süresini artırıyor ve performansı düşürüyor.En iyi görüntüleme sayısı stratejisi

Sayıları bir dosyaya 1 saat boyunca kaydetmeyi ve sonra veritabanını güncellemeyi düşünüyordum, ancak birisi ağır yük siteleri için dosya işlemleri kullanmadığımızı söyledi.

Lütfen bunu yapmak için en iyi stratejiyi öner.

Not: Benzersiz görünümleri saymaya ihtiyacım yok.

+0

Sanırım işlemler iyi olabilir. – hjpotter92

+0

Bu analitik amaçlar için mi? Öyleyse, görünümleri izlemek için Google Analytics veya Jetpack gibi ücretsiz bir hizmet kullanmayı düşünebilirsiniz. –

+0

Önce verileri önbelleğe almak ve sonra da bazı görünümlerden sonra veritabanına güncellemek için APC önbelleğini kullanmayı düşünmeli miyim? –

cevap

1

Web sunucusu günlükleriniz zaten bu verilerin çoğunu sizin için takip edecektir.

Öneriler günlükleri saatte bir kez döndürüyor ve toplu istatistikleri üreten ve bunları DB'de depolayan zamanlanmış bir işi var.

+0

Güzel görünüyor.Sunucularla ilgili fazla bir bilgim yok, lütfen webservers günlüklerini nerede bulabileceğimi söyleyin. –

+0

Hangi web sunucusunu kullanıyorsunuz ve hangi işletim sistemini kullanıyorsunuz? –

0

Bu bilgileri doğrudan MySQL'de tutmak ve güncellemekte herhangi bir sorun olmamalıdır. Saatte 3000 isabet, saniyede bir sorgudan daha az anlamına gelir. InnoDB depolama motorunu kullanarak bu tablo kilitleme sorunlarını kaldırmalıdır. Bununla birlikte, InnoDB'nin birçok seçeneği vardır ve verimli çalışmak için doğru şekilde yapılandırılması gerekir - bu önemlidir. Birincil anahtar (type, period, id) olacağını

id - page id 
type - period length, could be 'day', 'week', 'month' 
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM 
     - depending on the contents of 'type' field 
count - hit count for a url over given period 

:

Yorumlarınıza dayanarak ben aradığınız yapısı gibi bir şey düşünüyorum. Verimli için (id, period) ve (type, period, count) üzerine de endeksler:

SELECT * 
FROM ... 
WHERE type='week' 
    and period = 20120409 
ORDER BY count DESC 

sayfa oluşturulduğunda, sayısı ile her dönem için insert kayıtları = 0. sayfa isabet aldığında, basit bir güncelleştirme çalıştırın:

UPDATE table 
SET count = count + 1 
WHERE id = $page_id 
    AND period IN (201204, 20120409) 

Her üç kaydı da 'gün', 'hafta' ve 'ay' istatistikleri için günceller.

+0

Görünümün türünü saklamayacağım yerine görünüm türünü tarihe göre hesaplıyorum. Durumumda bile kimlik olarak URL yeterli değil. Ancak her görünümde veritabanı güncelleniyor. –

+0

Her bir görünümle ilgili bu bilgilerin güncellenmesi, saniyede yalnızca 1 sayfa görüntüleme ile ilgili bir sorun olmamalıdır. – Mushu

+0

Ve URL yerine ID'yi kullanabiliyorsanız, URL sütunu gerekli olmaz. Otomatik artıştan ziyade sayfa kimliği değerini taşıyan 'id' yeterli olur. – Mushu

0

Zaten bunu çok etkili yapan bir eklenti var (ancak yazıları sıralamak için verileri kullanarak çalışmak zorunda olsanız da): BAW Post Views Count. Postmeta'da her şeyi depolar, böylece ayrı meta girişlerde günlük ve diğer toplamları elde etmek ve saklamak kolaydır. Bunu, birkaç sitede 50.000 sayfa görüntüleme süresiyle kullanıyorum ve hiçbir şeyi yavaşlatmıyor.