Veritabanında php veya mağaza ile mesajları saymak

7 Cevap php

Ben bu tablolar var:

forum

  • kimlik
  • isim
  • tanım

posts

  • kimlik
  • forumkimlik
  • vücut

Ben bu forumda yapılmış mesajların sayısını saklamak nerede forumda bir alan oluşturmak gerekir nedir acaba nedir? O birisi bir yazı yapar her zaman güncelleyin. ya da ben php ile onları saymak gerekir? Bu çok büyük bir performans farkı var mı?

7 Cevap

Küçük forum - büyük bir anlaşma değil. Ama forum basit bir sorguda mesajların sayısını sayarak büyük bir fark yaratacak büyüdükçe. Bunun yerine bir myisam bir innodb tablosunda mesajları saklamak durumunda fark daha da belirgin olacaktır. Eğer çok büyük büyüyen konusunda endişeli değiliz Yani, bir sorgu kullanabilirsiniz. Aksi takdirde, bir sütun ekleyebilirsiniz.

Edit - Benim tavsiye? Kendinizi gelecekte baş ağrısı kaydedin ve bir sütun ekleyin.

Eğer sadece mesaj tablosunu sorgulamak ve istediğiniz forumid ile mesajları saymak gerekir.

SELECT count(*) FROM `posts` WHERE `forumID` = XX;

Eğer sorgularda sık sık kullanacağız yana, zaten forumid üzerinde bir dizin olmalıdır. Bu endekste, bu sorgu çok, çok hızlı bir şekilde çalışacaktır.

Ben count(), ben performansında büyük bir fark gerçekten var olduğunu sanmıyorum MySQL adlı kullanarak daha iyi sanırım.

Aşağıdaki sorgu hızlı olmalıdır:

SELECT COUNT(*)
FROM posts
WHERE forumID = @forumID

Bunu bir tablo taraması yapmanıza gerek kalmaması bir dizin forumid sütun üzerinde olduğundan emin olmalısınız.

Sorulara "Ben forum tabloya [sayaç] eklemek gerekir" ve "evet" ve "evet, mesajlardan çok varsa." Olan "çok büyük bir performans farkı var" Eğer mesajları ton yoksa bile, ben hala forum tablosu böyle bir sayaç eklemeyi öneriyorum.

Eğer ikilemler bu tür çok karşılaşma olacak ve zaten varolan malzemeyi yeniden zaman oldukça çok harcamak gerekir çünkü Ayrıca, yerine kendi kodlama bir forum yazılımı kullanmayı düşünmelisiniz.

Tek seferde tüm:


SELECT post.forumID, forum.name, COUNT(post.forumId) as postCount
FROM post INNER JOIN forum ON post.forumId = forum.id 
GROUP BY post.forumID, forum.name

Ben COUNT(*) her saat ya da ne zaman eski bir yazı silinir hesaplayan bir cron komut dosyası oluşturmak istiyorum:

SET @mytime = CURRENT_TIME()

UPDATE  forums f
SET     post_count = 
        (
        SELECT  COUNT(*)
        FROM    posts p
        WHERE   p.forumID = f.id
                AND p.date <= @mytime
        ),
        count_updated = @mytime

Ve COUNT(*) sorguda yeni mesajlar:

SELECT  post_count +
        (
        SELECT  COUNT(*)
        FROM    posts p
        WHERE   forumID = f.id
                AND p.date > f.count_updated
        )
FROM    forums f
WHERE   f.id = @id

Bu UPDATE havai ve SELECT yükü arasında iyi bir değiş tokuş olduğunu.