İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

PHP ve MYSQL optimizasyon. (Bilgi paylaşım)

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
Bu başlık altında herkes buna benzer optimizasyonlarını paylaşırsa çok yararlı olacaktır hepimiz için.

Ben bir alıntı ile başlıyorum.

MySQL sorguları sağdan sola işlendiği için özel seçimlerinizi (primary key gibi) en sağa yazın.
Tüm alanları seçmek yerine (SELECT *) yalnızca kullanacağınız sütunları seçin (SELECT a, b, c).
Çok nadir değişen bilgileri veritabanına koymak yerine bir dosyaya yazın.
Seçmek ve sıralamak istediğiniz (WHERE ve ORDER BY) alanlar için index kullanın.
Index‘ler aramalarınızı çok hızlandırır, ancak yeni kayıt girişini yavaşlatır (insertion).
Index’lerinizi analiz etmek için EXPLAIN komutunu kullanın.
Yaptığınız aramada yalnızca 1 girdiye ihtiyacınız varsa her zaman LIMIT 1 kullanmalısınız. Böylece MySQL istediğiniz girdiyi bulduğu anda aramayı durdurur.
Eğer sonuçlarınızı

$girdi = mysql_fetch_array($sorgu)

şeklinde alıyorsanız verilere iki şekilde ulaşabilirsiniz: $girdi[0] ve $girdi['sütunismi']. Sütun numarasıyla verilerinize ulaşmıyorsanız ekstradan boşu boşuna bir $girdi[int i] array’i oluşturuyorsunuz demektir. Sadece $girdi['sütunismi'] şeklinde verilerinize ulaşıyorsanız

$girdi = mysql_fetch_assoc($sorgu)

kullanın.

Bazen mysql_free_result() kazandırdığından fazla bellek kullanın. Farkı memory_get_usage() ile kontrol edin.
Veritabanından sürekli aynı bilgileri istemeyin, gerekiyorsa sonucu değişkenlere kaydedin.
Verilerinizi olabildiğince NOT lisanssız tanımlayın. Hem her veri başına 1 bit kazanacak, hem de işleminiz hızlanacaktır.
Verinize uygun türü seçin. Örnek olarak INT unsigned olarak 4294967295′e kadar sayıları tutar, ki bu çoğu zaman çok büyüktür. Uygunsa MEDIUMINT veya SMALLINT kullanın.
Tabloya veri eklerken öntanımlı değerleri kullanın, yalnızca öntanımlıdan farklı değerleri belirtin.
PHP
Birçok blok kullanmak uygulamanızı yavaşlatır.

Hızlı:
< ?
...
...
...
?>

Yavaş
< ? ... ?>
< ? ... ?>
< ? ... ?>

(1) şeklinde bir kod genelde (2)’den hızlı çalışır.

Gerekmediğinde string birleştirmeyi (concatenation) kullanmayın.

Hızlı:
“SELECT id FROM tabell WHERE id = $_SESSION[id] LIMIT 1″

Yavaş
“SELECT id FROM tabell WHERE id = “.$_SESSION[’id’].” LIMIT 1″

String’lerinizi çift tırnak (”) yerine tek tırnakla (’) açıp kapatmanız uygulamayı biraz hızlandırabilir. Php “…” içindeki değişkenlere bakarken ‘…’ içindeki değişkenleri önemsemez. Tabii ki bunu string içerisine değişken yazmak istemediğinizde kullanmalısınız.
String’leri ve değişkenleri echo ile bastırken nokta (.) yerine virgül (,) kullanmak daha hızlıdır. Örnek:

echo “bir degisken” , $degisken, “yaziyor…”;

Not: Bu yalnızca birden fazla string parametresi alabilen echo fonksiyonu için geçerlidir.

echo, print‘ten hızlıdır.
for döngüleriniz için üst limiti döngüden önce bir değişkene atıp kullanmak her turda bu sayının tekrar tekrar hesaplanmasını engeller:

Hızlı:
$maxvalue = 100/10;
for($i=0; $i<$maxvalue; $i++){
// kodlar
}

Yavaş:
for($i=0; $i<100/10; $i++){
// kodlar
}

İşiniz bittiğinde değişkenlerinizi ve özellikle büyük array’lerinizi unset() kullanarak belleğe geri döndürün.
Son söz ve kaynaklar
Mümkünse her veritabanı güncellemesinden sonra veya belli zaman aralıklarında statik html dosyaları oluşturmak tabii ki en iyi optimizasyon olacaktır.

Daha detaylı bilgi için aşağıdaki adresleri ziyaret edebilirsiniz:

Alıntı Yapılan URL
 

*siber*

0
İyinet Üyesi
Katılım
20 Temmuz 2005
Mesajlar
2,014
Reaction score
1
Konum
about:blank
Bu başlık altında iyinet, Angelo, hdogan, Ceaser ve diğer ismini sayamadığım arkadaşların yazılarınıda görmek isterdim :(
 

webyazilim

0
İyinet Üyesi
Katılım
12 Haziran 2006
Mesajlar
1,511
Reaction score
0
Konum
Kayseri
- mysql_fetch_row ve while ile data çekmek aslında kullanması zor olsa da ama en hızlısıdır.

- html kodları echo içinde vermemek hatta echo da saf db verisi vermek gerekir

- değişkenlerinizi mysql free_result yerine öldürebilirsiniz. bir sonraki döngüde eğer üstteki sorgu sonucunu kullanmayacaksanız aynı değişken ismini verin.

- açıklama satırı kullanın yarın hiçbirşey hatırlamayabilirsiniz

- yeni ve hızlı güncellenen php yazılımları xoops, phpmyadmin, drupal izleyin.

- yeni birşey yapıp uyumluluklarla uğraşacağınıza php de smarty, pecl gibi paketleri deneyin. evrensel kabul görmüşlerdir.
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
Eger tek satir tek sütunden bilgi alacaksaniz mysql_result u tercih edin.
yani diyelim
$rs = mysql_query("Select count(uye) as toplam from onlineuyelertablosu");
$toplam = mysql_result($rs,toplam);
Bu biraz olsun isinizi hafifletir.

Yanlisim varsa üstadlar düzeltsin.
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
Yalnizca yukarda belirttim. Tek deger alacaksaniz mysql_result kullanin tabi ki cok degisken gelecekse mysql_fetch_assoc veya mysql_fetch_array kullanin.
Ama dbden alinacak tek deger icin mysql_Result ' un daha avantajli oldugu kanisindayim.

mysql_result

Bir yer daha :
Article Discussion: Writing Clean and Efficient PHP Code - Dev Shed

Burdan alinti :
I did some simple benchmarking and my results reflected the PHP docs:

1. In cases where 1 row was returned and using only 1 column, mysql_result (option1) was faster by a smidge.
2. In cases where many rows (1500 as in the example), mysql_fetch_row (option2) was about 15% faster when only using 1 column from the row.
3. In cases where many rows were returned and 2 columns were used, mysql_fetch_row was on the order of 100% faster.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
Yabancı forumda yazdı diğe ve ingilizce kullandı diğe sence bizden daha mı zeki bu adam?

o quote ni üzülerek okuyorum ve demekki yabancilar bizden daha zeki ve daha iyi biliyorlar bu işi 97 den beri php kullaniyorum demek boşa ugraşmışım.
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
Yabancı forumda yazdı diğe ve ingilizce kullandı diğe sence bizden daha mı zeki bu adam?

o quote ni üzülerek okuyorum ve demekki yabancilar bizden daha zeki ve daha iyi biliyorlar bu işi 97 den beri php kullaniyorum demek boşa ugraşmışım.

Öyle birsey demek istemedim. Bunu ben mysql manuelde bulmustum bir daha bulamadim simdi google a baktim.
Türkce olarak da almanca olarak da okudugum icin ben kendim tek satir tek kolon icin mysql_result kullaniyordum. Hatta mysql_fetch_array ile kendim kiyasladim ve hiz farki vardi o zaman.

En yakinda tekrar deneyecegim ve hakliysaniz kullanmayacagim. Neticede ben kaybederim siz degil baskasi degil.

Yabancilar bizden zeki degil, Türkce kaynak az oldugu icin ben genelde yabanci olarak ariyorum ve tabi ki tek buldugum sayfaya göre karar vermiyorum.
Programci olmadigim icin de komutlarin arkada hangi yoldan islem gördügü konusunda fikrim olmadigi icin buldugum bilgilerle yol almaya calisiyorum.

Umarim bu yanlis anlasilmayi cözmüstür.
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
tek satir için zaten mysql_fetch_row dige bir fonksiyon var denedin mi?
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
mysql_fetch_row bana agir geldi denedigimde.

Php.net in kendi sayfasindan alinti yapiyorum :
PHP: mysql_result - Manual

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below).

Buna göre eger cok sayida sonuc alacaksaniz fetch_row, assoc, array kullanin diyor. Ama dedigim gibi ben tekrar bir deneyecegim.
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
Evet Denemeyi yaptim. Siz haklisiniz. Ama farklar cok az. Yalniz fetch_assoc digerlerine nazaran daha hizli. Sebebi de direkt kolon ismine göre sonuclari almasi.

Deneme bir laptopta yapildi.
Windows XP home + WAMP5 kurulu.

Her deneme arasinda bir haksizlik olmamasi icin servisler kapatip acildi.
Yani apache, php ve mysql reset edildi.

Bundan sonraki scriptlerde mysql_result kullanmamaya calisacagim. Beni bu testi yapmama sebep oldugunuz ve bilgilendirdiginiz icin tesekkür ederim.
Önceki mesaj silinebilir de takip edecekler icin kalabilir de.

1. Deneme
PHP:
ob_start();
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;	 
$connection = mysql_connect ("$db_host", "$db_kullanici","$db_sifres") or die ($fhl_vtb);
$vtb = mysql_select_db($db_vtb) or die ($fhl_db);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Deneme</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
</head>
<body>
<?php
$sql = "select count(id) as toplam from tablo where textfield like '%a%'";
$rs = mysql_query($sql);
$toplam = mysql_result($rs,toplam);
echo "toplam : $toplam <br />";

// end time
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$total = $endtime-$starttime;
echo ($total).' ms'; // displays mhz of machine
?>
Sonuc 1 :
toplam : 255181
22.2239058018 ms

Deneme 2 :

PHP:
ob_start();
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;	 
$connection = mysql_connect ("$db_host", "$db_kullanici","$db_sifres") or die ($fhl_vtb);
$vtb = mysql_select_db($db_vtb) or die ($fhl_db);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Deneme</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
</head>
<body>
<?php
$sql = "select count(id) as toplam from tablo where textfield like '%a%'";
$rs = mysql_query($sql);
$daten = mysql_fetch_assoc($rs);
$toplam = $daten['toplam'];
echo "toplam : $toplam <br />";

// end time
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$total = $endtime-$starttime;
echo ($total).' ms'; // displays mhz of machine
?>

Sonuc 2 :
toplam : 255181
20.7312190533 ms

Deneme 3 :
PHP:
ob_start();
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;	 
$connection = mysql_connect ("$db_host", "$db_kullanici","$db_sifres") or die ($fhl_vtb);
$vtb = mysql_select_db($db_vtb) or die ($fhl_db);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Deneme</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">
</head>
<body>
<?php
$sql = "select count(id) as toplam from tablo where textfield like '%a%'";
$rs = mysql_query($sql);
$daten = mysql_fetch_array($rs);
$toplam = $daten['toplam'];
echo "toplam : $toplam <br />";

// end time
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$total = $endtime-$starttime;
echo ($total).' ms'; // displays mhz of machine
?>

Sonuc 3 :
toplam : 255181
22.9098858833 ms
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
yanlız microtime fonksiyonu dah da feci gebertir :) bu ayrıntıyı atlamışsın
 

Alexis

0
İyinet Üyesi
Katılım
24 Ekim 2005
Mesajlar
678
Reaction score
5
O gebertir, bu gebertir, microtime vb. sayfanın toplam işlem süresini nasıl ölçeceğim şimdi ?

çok fazla db içeren tablolarda myisam kullanmaktansa innerdb kullanınız.. hala myisam ise

insert into yeniinnerdbtablo select * from eskimyisamtablo

dan yararlanarak innerdb ye ceviriniz.

bunlar performansınızı %90 artıracaktır. aklıma bu kadar geldi. kolay gelsin.

scriptim çalışacak mı bunu yapınca ?
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
ona göre ayarlayacaksin armut piş ağzıma düş şeklinde olmaz sorguların değişecek vs vs vs
 

Eglence-Siteleri

0
İyinet Üyesi
Katılım
1 Şubat 2006
Mesajlar
762
Reaction score
0
yanlız microtime fonksiyonu dah da feci gebertir :) bu ayrıntıyı atlamışsın

Bir sekilde ölcmem lazim degil mi.
Ama ölcükten sonra cikartirim. Kimisinde unutuyorum acikcasi.

Ama yakinda 400 000 - 500 000 veri olan bir db ile ugrasacagim. O zaman görecegiz hanyayi konyayi.

Saygilar, iyi calismalar
 

Caesar

0
İyinet Üyesi
Katılım
5 Haziran 2006
Mesajlar
1,894
Reaction score
7
tabi canım ölçtükten sonra çıkartman en mantıklısı. gerekmedikte microtime() date() mysql_result() kullanmaktan kaçmak lazım zaten.


Sıra sana geldi @*siber* zaten bildiklerimi yazarak yardımcı olmaya calisiyorum ama konusmalarına dikkat ben ne senin para ile tuttuğun bir sokak webmasteriyim nede sana calisan bir insanım. kişilerle konusmalarına dikkat et emir cümleleri kullanma.
 

hdogan

0
İyinet Üyesi
Katılım
14 Ekim 2004
Mesajlar
693
Reaction score
2
Konum
Ankara
Saglikli sonuc almak icin microtime() olayini kalibre edin :)

Ornek:

PHP:
<?php
function microtime_float() {
    return preg_replace("/^0?(\S+) (\S+)$/X", "$2$1", microtime());
}

$kalibre_basla = microtime_float();
$kalibre_bit = microtime_float();
$kalibre_fark = $kalibre_bit - $kalibre_basla;

$kod_basla = microtime_float();
...
...
$kod_bitir = microtime_float();
$gercek_zaman = ($kod_bitir - $kod_basla) - $kalibre_fark;
?>

Bu daha saglikli sure bilgisi verecektir.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst