MySQL sorgusu çalıştırmak için> 15 saniye sürer;

4 Cevap php

Peki ben bir video sitesi ve olan kendi tabloları birkaç var:

tags

id ~ int(11), auto-increment [PRIMARY KEY]
tag_name ~ varchar(255)

videotags

tag_id ~ int(11) [PRIMARY KEY]
video_id ~ int(11) [PRIMARY KEY]

videos

id ~ int(11), auto-increment [PRIMARY KEY]
video_name ~ varchar(255)

Şimdi bu noktada etiketler table> 1000 satır vardır ve videotags table> 32000 satır vardır. Ben en yaygın tüm etiketleri görüntülemek için bir sorgu çalıştırdığınızda Yani en azından ortak it> yürütmek için 15 saniye sürer.

Ben aşağıdaki gibi (basitlik için aşağı sulanan) PHP ve kodumu kullanıyorum olduğunu:

foreach ($database->query("SELECT tag_name,COUNT(tag_id) AS 'tag_count' FROM tags LEFT OUTER JOIN videotags ON tags.id=videotags.tag_id GROUP BY tags.id ORDER BY tag_count DESC") as $tags)
{
    echo $tags["tag_name"] . ', ';
}

Şimdi hızlı olarak bu% 100 doğru olması benim için önemli olmadığını akılda tutarak. Yani sorgu günde bir kez idam edildi ve sonuçları günün geri kalanı için kullanılan bile umurumda olmaz.

MySQL / PHP önbelleğe alma hakkında kesinlikle hiçbir şey bu yüzden lütfen yardım biliyorum!

4 Cevap

MarkR endeksi bahsetti. Emin olun:

create index videotags_tag_id on videotags(tag_id);

32.000 satırlar hala küçük bir tablodur - performans kötü olmalıdır yolu yoktur.

Eğer sorguya EXPLAIN çalıştırabilirsiniz - Seni indeksleri yerde yanlış konum tahmin ediyorum.

Siz söz söylemek:

tag_id ~ int(11) [PRIMARY KEY]
video_id ~ int(11) [PRIMARY KEY]

Onlar için kesinlikle vardır? Eğer değilse, o dizin kullanmak olmaz.

Ben senin en iyi bahis zaman işler değişir korumak özet tablo çeşit oluşturmak için olduğunu düşünüyorum.

Yukarıdaki sorgu tarafından grubunda agrega bulmak için tablodaki tüm satırları taramak gerekiyor - WHERE şartı vardır. Mutlaka her satır kontrol etmek olduğu gibi fıkra, optimizasyon hiçbir umut has no ile sorgu.

Düzeltme, veri değiştirme veya önemli bir değişiklik olduğunda, zaman zaman korumak zorunda olacak, bu sorgu (veya benzeri), sonucu olarak aynı veri ile bir özet tablo oluşturmak.

Sadece sen her güncelleştirme, ya da bazı kombinasyonu, bir tarifeli olarak özet tablosunu güncelleştirmek için uygun olsun, uygulama ve verilerin niteliğine göre, karar verebilir.

Eğer katılmak yapıyoruz gibi, sağ dizin hala yararlıdır, ama doğru, biliyordu ve zaten yapmıştı?

Eğer InnoDB veya MyISAM kullanıyor musunuz? MyISAM COUNT temelde özgür, ama InnoDb fiziksel satırları saymak zorundadır.