|
Author
|
Topic: Benim uygulama seklim ilkel mi acaba? (Read 376 times)
|
mrtblt
Yeni Kullanıcılar
Offline
Posts: 21
|
Sitede millet foreign key, join falan gibi seylerden bahsediyor. Bunlari hic duymamis degilim tabiiki hatta join bir kac kez kullandim  Sonra acaba ben veritabanindan kayit cekerken sonuc elde ediyor olsam bile cok ilkel ve uzun yollarimi deniyorum dedim kendi kendime. Sanki veriyi cekmek icin cok fazla sorgu yapiyorum gibime geldi. Size benim yaklasimimi gosteren bir kod ornegi veriyorum asagida Bu excele veri atan scriptin bir parcasi ve burada tabloda kullanmak uzere veri cekmem gereken dort tablonun herbiri icin ayri ayri sorgu yapiyorum Incelerseniz sevinirim case'11': //Musteri bazinda toplam siparis adetleri(renk dagilimsiz) echo"SIP NO\tTARIH\tMUSTERI\tKOD\tRENK\tSET ADEDI\tTOPLAM ADET\tBRIM FIYAT\tTUTAR\tVAT\tBRUT TOPLAM\t\n"; $sql = mysql_query("SELECT * FROM sip_header where id='$sid'"); $row = mysql_fetch_object($sql); $sql3 = mysql_query("SELECT * FROM sip_lines where sipno_id='$row->id'"); while($row3 = mysql_fetch_object($sql3)) { $sql2 = mysql_query("SELECT * from clients where id='$row->client_id'"); $row2 = mysql_fetch_object($sql2); $sql4 = mysql_query("SELECT * from produse where id='$row3->code_id'"); $row4 = mysql_fetch_object($sql4); echo"".$row->sip_no."\t".$row->sip_date."\t".$row2->cl_name."\t".$row4->cod."\t".$row3->color."\t".$row3->amount."\t".$row3->set_amount*$row3->amount."\t".str_replace(".",",",$row3->unit_price)."\t".str_replace(".",",",$row3->line_net)."\t".str_replace(".",",",$row3->line_vat)."\t".str_replace(".",",",$row3->line_grand)."\t\n"; } break;
|
|
|
|
|
Logged
|
|
|
|
phparmy
phparmy
PHP Stajyeri

Offline
Posts: 371
Elektronik imzam.
|
$sql3 = mysql_query("SELECT * FROM sip_lines where sipno_id='$row->id'"); while($row3 = mysql_fetch_object($sql3)) { $sql2 = mysql_query("SELECT * from clients where id='$row->client_id'"); $row2 = mysql_fetch_object($sql2); $sql4 = mysql_query("SELECT * from produse where id='$row3->code_id'"); $row4 = mysql_fetch_object($sql4); echo"".$row->sip_no."\t".$row->sip_date."\t".$row2->cl_name."\t".$row4->cod."\t".$row3->color."\t".$row3->amount."\t".$row3->set_amount*$row3->amount."\t".str_replace(".",",",$row3->unit_price)."\t".str_replace(".",",",$row3->line_net)."\t".str_replace(".",",",$row3->line_vat)."\t".str_replace(".",",",$row3->line_grand)."\t\n"; }
Örnek olarak verdiğin kodun burasına baktığımızda while döngüsü içinde sorgu kullanmışsın. Eğer veritabanında 100 kayıt varsa yaptığın yanlışı fark etmeyebillirsin. Ama veriler arttıkça sayfan yavaşlamak değil açılmayacak hatta sunucun kilitlenecekdir. 10000 Kayıtlı bir tablo için bu işlemi yaptığında Sunucunda çok fazla kaynak tüketmiş olacaksın. Ama işin bir de farklı yanı var bazen tablolarımız öyle oluyor ki gerçekten tablo birleştirme, JOIN yapamıyoruz illa yukarıdaki gibi bir durum ortaya çıkıyor. Bunun içinde veri tabanını yaparken doğru tasarlamak gerekiyor. Veri tabanı tasarımı aslında çok ciddi bir iştir. Tablolardaki alanları tablolar arasında ilişkileri kafamız göre değil de hesap kitap yaparak oluşturmak gerekiyor. Maalesef bizde çoğu proje baştan değil de proje yaparken planlandığı için veritabanımız da allak bullak oluyor. Tam programı yada siteyi yazıp bitirecekken adamın aklına yeni bir fikir geliyor illa bu versiyonda onu da isterim diye tutturuyor. Sonuç olarak biz programcılar al o zaman istediğin gibi olsun diyerek yukarıdaki örneğe benzer bir sorgu yapıp bırakıyoruz.
|
|
|
|
|
Logged
|
|
|
|
mrtblt
Yeni Kullanıcılar
Offline
Posts: 21
|
Peki boyle bir sorguyu siz nasil yapardiniz? Ote yandan where ile condition olusturdugumuz vakit gene mi veri tarafigi sanki tum verileri cekmis gibi yuksek mi oluyor mesela $sql2 = mysql_query("SELECT * from clients where id='$row->client_id'"); $row2 = mysql_fetch_object($sql2) Burada bir dongu yok. bu sorgulama gene tum kayitlari cekmis gibi serveri yorarmi soyle soylieyim yukaridaki gibi yapmakla asagidaki sekilde yapmanin ne farki var sorgu while dongusu { if (deger) {sonuc}
} cigudusel olarak baktigimda servere binen yuk bakimindan diyebilirimki ikinci cok daha agir ama sizin yazdiklarinizdan sanki birinci sorgu ile ikinci sorgu arasinda pek bir fark yok gibi geldi!
|
|
|
|
|
Logged
|
|
|
|
phparmy
phparmy
PHP Stajyeri

Offline
Posts: 371
Elektronik imzam.
|
Anlatmak istediğim o değilidi. Tabi ki 100.000 kayıt da olsa siz select * from haberler deseniz bu sorgu normaldir. Bunda bir problem yok. Benim anlattığım while döngüsü içine sorgu koyduğunuz zaman yavaşlama olacağıydı. Yani mysql_query fonksiyonunu binlerce kez çalıştırarak sorgu yapmak çok fazla kaynak tüketir.
|
|
|
|
|
Logged
|
|
|
|
mrtblt
Yeni Kullanıcılar
Offline
Posts: 21
|
O zaman soyle bisey daha soracagim Farzedelimki icinde 1 milyon kayit bulunan bir tablomuz olsun ve bu tabloda id alani primary key yani unique Ve soyle bir sorgu yapalim $sql=mysql_query("Select * from tablo where id='2957' "); $row=mysql_fetch_object($sql); $id=$row->id;
Ayni sonucu almak icin su sekildede yapabiliriz $sql=mysql_query("Select * from tablo"); while($row=mysql_fetch_object($sql)) { if ($row->id=2957) { $id=$row->id } }
Ikis arasinda performans farki var gibi gorunuyor ama nedir bu fark ve bu farki ortaya koyan etken nedir? Aslinda bazi seyleri ezbere yapiyoruz gibi ve 300-500 kayit icin bir sorun olmuyor ama bu 100 bin kayida ulastiginda yatali yaklasim eminim cok bas agritacak
|
|
|
|
|
Logged
|
|
|
|
|
GaziMarşı
|
Birinci örneğinde 1 sorgu çalıştırılıyor. Ve 1 sonuç geri geliyor. İstediğin veriyi mysql sana veriyor. İkinci örneğinde de 1 sorgu çalıştırılıyor geriye tablodaki tüm veriler geliyor. 1 kayıt yerine 1milyon kayıtı belleğe alıyorsun. Ve sen bu verilerin içinde tekrar arama yapıyorsun. Bu şekilde kullanınırsan dosyadan veri okumak gibi oluyor...
|
|
|
|
|
Logged
|
|
|
|
phparmy
phparmy
PHP Stajyeri

Offline
Posts: 371
Elektronik imzam.
|
Veritabanı sırf verileri tutmak için yapılmamıştır. İstendiğinde bu verilerin hızlı bir şekilde bulunmasıda düşünülmüştür. Bir çok veritabanı var bunlar arasındaki farklar genelde veriboyutu , hız , fonksiyonellik, güvenlik, taşınabilirlik gibi farklı kıstaslar ile ayrılırlar.
Ayrıca bir çok arama alqoritması var QuickSearc,BubleSearch gibi. MySQL için kendine özel bir arama algoritması yapmışlardır ve araken ona göre arıyordur.
|
|
|
|
|
Logged
|
|
|
|
|
 |