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.
60k satırlı MySQL veri tabanı hk.
7
●711
- 10-10-2014, 20:13:0960k 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:17:30Evet, 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:35MisafirMysql 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.nilbek adlı üyeden alıntı: mesajı görüntüle
- 10-10-2014, 20:32:28Örnek bir sorgu bu şekilde, tüm kolanlar lazım.atay adlı üyeden alıntı: mesajı görüntüle
$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) - 12-10-2014, 11:42:28Merhabalar 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.nilbek adlı üyeden alıntı: mesajı görüntüle