• 10-10-2014, 20:05:29
    #1
    60k satırlı bir veri tabanımız var ve satır sayısı her geçen gün artıyor. Cache sistemi kullanmamıza rağmen, sayfanın ilk defa açılması durumunda saniyeler sürüyor. Veri tabanı sunucunun %140'ını kullanıyor normal zamanlarda, yoğun saatlerde erişim kesiliyor.

    Bunun sebebinin veri tabanının efektif kullanılmadığından kaynaklandığını öğrendik. Sitemizdeki veritabanı bağlantılarına ve db yapısına inceleyerek yardımcı olabilecek birisi var mıdır?

    Veri tabanı ve site kodlaması, yıllar önce tarafımdan yapılmıştır. MySQL bilgim kısıtlı olduğu için çalışsın yeter mantığıyla yapmıştık ama artık sıkıntı oluyor.
  • 10-10-2014, 20:13:09
    #2
    60k MySQL bir tablo için endişe edecek bir boyut değil aslında. Eğer sunucu donanımı çok düşük değilse bu kadar bir yavaşlama söz konusu olmamalı. Şunları kontrol edin derim;

    - Tablodaki kolon adedi nedir? Fazlaysa, hepsi o tabloda gerekli mi? Ek kolonları farklı bir tabloya alabilir misiniz? (Özellikle text kolonları)
    - Sayfada mysqle sorgu atarken * gibi tüm kolonları çekecek şekilde mi atıyorsunuz? Eğer öyleyse, sadece gerekli kolonları alacak şekilde değiştirin.
    - Sorguda where var mı? Varsa, where attığınız kolon index mi? Değilse, index yapın.
    - Sorguda bir LIMIT var değil mi? İhtiyacınız olduğu kadar çekiyorsunuz?
  • 10-10-2014, 20:14:53
    #3
    Misafir
    Veritabanı büyüklüğü önemli burda. (mb,gb vs)
    Birde sorgulara göre index / key ataması yapılırsa kaynak kullanımı azaltılabilir.
  • 10-10-2014, 20:17:30
    #4
    Evet, 60k olduğunu az olarak ifade etmek için belirttim. Ben de yavaşlığın büyüklükle alakalı olduğunu düşünmüyorum. Fakat bahsettiğiniz diğer hususlar hakkında detaylı bir inceleme yapacağım onlara hiç dikkat etmedim kod yazarken ve tabloyu oluştururken.

    Toplam büyüklüğü, onlarca mb cinsinden ifade edebiliriz. Bence çok küçük olarak sayılabilir.
  • 10-10-2014, 20:20:35
    #5
    Misafir
    nilbek adlı üyeden alıntı: mesajı görüntüle
    Evet, 60k olduğunu az olarak ifade etmek için belirttim. Ben de yavaşlığın büyüklükle alakalı olduğunu düşünmüyorum. Fakat bahsettiğiniz diğer hususlar hakkında detaylı bir inceleme yapacağım onlara hiç dikkat etmedim kod yazarken ve tabloyu oluştururken.

    Toplam büyüklüğü, onlarca mb cinsinden ifade edebiliriz. Bence çok küçük olarak sayılabilir.
    Mysql workbench kur bilgisayarına ve veritabanına bağlan. Sorguların ne sürede işlendiğine göz gezdir. Uzun süren sorgularla alakalı çalışma yaparsan sistemi biraz daha toparlamış olursun. Where içinde kullandığın alanların index olmasına özen göstermeye bak.
  • 10-10-2014, 20:32:28
    #6
    atay adlı üyeden alıntı: mesajı görüntüle
    60k MySQL bir tablo için endişe edecek bir boyut değil aslında. Eğer sunucu donanımı çok düşük değilse bu kadar bir yavaşlama söz konusu olmamalı. Şunları kontrol edin derim;

    - Tablodaki kolon adedi nedir? Fazlaysa, hepsi o tabloda gerekli mi? Ek kolonları farklı bir tabloya alabilir misiniz? (Özellikle text kolonları)
    - Sayfada mysqle sorgu atarken * gibi tüm kolonları çekecek şekilde mi atıyorsunuz? Eğer öyleyse, sadece gerekli kolonları alacak şekilde değiştirin.
    - Sorguda where var mı? Varsa, where attığınız kolon index mi? Değilse, index yapın.
    - Sorguda bir LIMIT var değil mi? İhtiyacınız olduğu kadar çekiyorsunuz?
    Örnek bir sorgu bu şekilde, tüm kolanlar lazım.

    $sql4 = mysql_query("SELECT * FROM haber WHERE ID=$gelen LIMIT 1");
    while($row3 = mysql_fetch_array($sql4)) 
    {
    	$kaynak = $row3['kaynak'];
    	$sql3 = mysql_query("SELECT * FROM kaynaklar WHERE ID=$kaynak LIMIT 1");
    Bu şekilde devam ediyor. Yani iç içe döngü yapmak zorundayım haber ve kaynağıyla ilgili bilgileri birlikte verebilmek için. Bu yapı verimli mi?

    Verimli değilse nasıl yapmak lazım.

    Bu şekilde kullanabilmek için hangi tablonun hangi sutünlarına hangi özellikleri vermek lazım? (Birincil, benzersiz, index hangileri olacak)
  • 11-10-2014, 23:10:20
    #7
    sorun devam ediyor.
  • 12-10-2014, 11:42:28
    #8
    nilbek adlı üyeden alıntı: mesajı görüntüle
    Örnek bir sorgu bu şekilde, tüm kolanlar lazım.

    $sql4 = mysql_query("SELECT * FROM haber WHERE ID=$gelen LIMIT 1");
    while($row3 = mysql_fetch_array($sql4)) 
    {
    	$kaynak = $row3['kaynak'];
    	$sql3 = mysql_query("SELECT * FROM kaynaklar WHERE ID=$kaynak LIMIT 1");
    Bu şekilde devam ediyor. Yani iç içe döngü yapmak zorundayım haber ve kaynağıyla ilgili bilgileri birlikte verebilmek için. Bu yapı verimli mi?

    Verimli değilse nasıl yapmak lazım.

    Bu şekilde kullanabilmek için hangi tablonun hangi sutünlarına hangi özellikleri vermek lazım? (Birincil, benzersiz, index hangileri olacak)
    Merhabalar yukaridaki sql kodu tamamiyle yanlistir. Bu gibi durumlarda yapilabilecek en guzel cozum JOIN kullanimi. mySQL ile join kullanim orneklerine internetten goz gezdirin. Ayrica siteniz haber sitesiyse anasayfanizi ve kategori listelerinin oldugu (spor, magazin gibi) haber listelerinizi cachelemeniz sql sorgularini biraz olsun azaltacaktir. Iyi calismalar dilerim.