Belirli bir satır görüşlerini Takibi

4 Cevap php

Ben kullanıcı mesajlarda oldukça çok sayıda görebilirsiniz bir site var. Bu yapılır her zaman ben UPDATE table SET views=views+1 WHERE id = ? benzer bir sorguyu çalıştırın. Bununla birlikte, bu yaklaşımın dezavantajları vardır:

  • Pageviews meydana geldiğinde izleme yolu yok - onlar sadece artırılır.
  • Genellikle kadarıyla anladığım kadarıyla, bu nedenle yavaş bu satırın bir sonraki SEÇİMİ yapma, sıranın MySQL önbelleğini temizleyin olacak tablo güncelleniyor.

Therefore I consider employing an approach where I create a table, say:
object_views { object_id, year, month, day, views }, so that each object has one row pr. day in this table. I would then periodically update the views column in the objects table so that I wouldn't have to do expensive joins all the time.

Bu Aklıma basit çözüm, ve o da en az performans etkisi ile biri gibi görünüyor. Katılıyor musunuz?

(Site PHP 5.2 üzerine inşa edilmiş, 1.4 Symfony ve durumda Doktrin 1.2 merak)

Edit:
The purpose is not web analytics - I know how to do that, and that is already in place. There are two purposes:

  • Kullanıcı Belirli bir nesne bugün ya da dün, örneğin gösterilmiştir kaç kez görmek için izin verir.
  • Sitenin moderatörleri Google Analytics, Omniture veya ne olursa olsun çözüm girmeden simple görünümü istatistikleri görmek için izin verir. Ayrıca, backend sonuçlar gerçek zamanlı olmalıdır, bir özellik wich GA şu anda sunamıyoruz. Ben (gerçek zamanlı değil, GA javascript gerektirir) kullanım verilerini almak için Analytics API'sini kullanmak istemiyorum.

4 Cevap

Quote : Updating the table that often will, as far as I understand it, clear the MySQL cache of the row, thus making the next SELECT of that row slower.
There is much more than this. This is database killer. I suggest u make table like this : object_views { object_id, timestamp} This way you can aggregate on object_id (count() function). So every time someone view the page you will INSERT record in the table. Once in a while you must clean the old records in the table. UPDATE statement is EVIL :) On most platforms it will basically mark the row as deleted and insert a new one thus making the table fragmented. Not to mention locking issues .

Umut olur

Rage gibi aynı doğrultuda, sadece orada bir milyon üçüncü parti log araçları varken, aynı sonuçları kendiniz yapıyor almak için gitmiyor. Eğer günlük olarak takip ediyorsanız, o zaman böyle WebTrends gibi temel bir program URL izlemek istediğiniz öğelerin kimliklerini içeren özellikle eğer hit izleme mükemmel yeteneğine sahiptir ... Ben bu herhelde, hepsi var bu araçları söz konusu olduğunda URL hakkında (Wordpress ile örneğin farklı URL yapıları sürü)

Eğer "izlenim" izleme içine arıyorsanız muhtemelen her nesneyi, sayfa, kullanıcıyı, ve muhtemelen sayfadaki konumu dayalı bir ağırlıklı değer izleme çünkü Şimdi, o zaman başka bir top oyunu. Bu durumda size ateş ve unut, başka bir sunucuda izleme barındırma performansınızı takip edebilirsiniz. 20091125-20091126 tarih değişiklikler, ait bir datediff işlevi diyelim yükü olmadan, basit bir sorgu zaman geçmişte ben bu kimliği karşı SQL güncellenmesi ve tarihin dize sürümünü kullanıyor ... bu şekilde çalıştı.

İlk yıl toplamak neden sadece hızlı sözler, ay, gündüz DATETIME, aklımda daha mantıklı olur.

Bir pazarlama / web için ise Ayrıca ben bu amaç için yapılmış bir araç kullanmak daha var, amaç bunu yapıyorsun kesin nedeni ne gerçekten emin stats değilim.

Şimdi size web erişim istatistikleri hakkında bir fikir vermek için yetenekli aracın iki büyük aile var, birini (awstats muhtemelen en popüler), ajax/1pixel görüntü tabanlı birini tabanlı log ({[(1) }]) en popüler olurdu.

Kendi istatistiklerini veritabanı oluşturmak için tercih ederseniz, muhtemelen PHP kullanarak kolayca bir günlük ayrıştırıcı oluşturmak için yönetebilirsiniz. Eğer apache günlükleri (veya IIS günlükleri) çok fazla bir yük ayrıştırma bulursanız, muhtemelen basit bir şekilde format bazı özel günlükleri çıkışına uygulama yapacak.

Ayrıca bir diğer olası çözüm memcached, cini yapabilirsiniz increment sayaç çeşit sağlamak kullanmaktır. Orada günlük görünümü ve sonuç her gün toplama bir komut olabilir.

Bunu yapmak için gidiyoruz eğer, neden sadece her erişimi oturum? MySQL oldukça iyi sürekli tablolarda önbelleğe ekler, böylece ekleme nedeniyle dikkate değer yavaşlama olmamalıdır. Hep koşmak Show Profiles performans ceza gerçekte ne olduğunu görmek için olabilir.

Datetime konuda, her zaman GROUP BY MONTH( accessed_at ) , YEAR( accessed_at) veya WHERE MONTH(accessed_at) = 11 AND YEAR(accessed_at) = 2009 kullanabilirsiniz.