SQL sorgusu optimize

3 Cevap php

Ben sorguyu şu var:

Select diary_id, 
   (select count(*) 
    from `comments` as c 
    where c.d_id = d.diary_id) as diary_comments 
From `diaries` as d

It takes long time (near 0.119415 in my case). How to make it faster?

Benim ana sorgudan her satır için yorum sayısı için ek bir sorgu yapmak: Ben tek bir yol görüyorum. Ama döngüsü sorguları yapıyor gibi bir şey olacak. Gibi bir şey:

while ($r = mysql_fetch_array($res))
{
   $comments = mysql_query("select count(*) from `comments` where d_id = ".$r['diary_id']);
}

Ben bu kötü bir strateji olduğunu düşünüyorum. Başka herhangi bir tavsiye?

3 Cevap

SELECT d.diary_id, count(c.d_id) as diary_comments 
FROM diaries d
LEFT OUTER JOIN comments c ON (d.diary_id = c.d_id)
GROUP BY d.diary_id

Aslında sadece günlükler tablodan gerekli tüm verileri Getirme çünkü ben downvoted edilmiş gibi görünüyor. Ben bu basitleştirilmiş bir örnek olduğu varsayılır ve gerçekte günlükler tablodan diğer alanların gerekli olacağını, ayrıca bu yöntem hiç bir yorumunuz var kayıtları geri getiriyor. Eğer bu iki şeyi hiç ihtiyacınız yoksa, o zaman ben diğer cevap giderdim.

Eğer yorum tablodaki gereken tüm veriler var gibi görünüyor, bu yüzden katılmak veya sorgu için bir sebep görmüyorum.

SELECT d_id AS diary_id, COUNT(*) AS diary_comments
FROM `comments`
GROUP BY d_id

tomhaigh 'ın çözüm için kesinlikle artı bir, bir grup bu durumda tam bir şeydir.

Bir diğer seçenek her zaman değer Burada iki seçeneğiniz var olduğunu hatırlayarak. Öncelikle her okuma üzerinde değerini hesaplamak için, ikincisi her yazma bunu hesaplamak ve sonucu depolamak için. İkinci durumda 'comments_count' olarak adlandırılan günlükler ek bir alan gerekir, bu yeni bir yorum ekleme artırılır olması gerekir. Açıkçası bu, her okuma ve yazma yavaşlatacaktır üzerinde sayısını çalışma dışarı daha az hassas olabilir. Ama okuma performansı zarar veriyor ve yazma belirgin daha az yaygın ise bu sorunu dikkate kullanışlı bir yol olabilir okur.