Veritabanları genelde uygulamaların en darboğaza gelen bölümleridir. MySQL ve PHP ile çalıştığım yıllar boyunca öğrendiğim ve etraftan gördüğüm bir sürü iyi uyguluma tarzı ile karşılaştım. Bunlardan en aklıma yatanları da burada paylaşıyorum.
Query Cache’i kullanmak.
Çoğu veritabanı gibi MySQL’in de kendine ait bir query cache’i (sorgu tamponu var). Temel olarak bu işlem sayesinde veritabanı aynı sorgular için her seferinde ayrı arama yapmak yerine daha önceki sonuçlardan kullanıyor. Ama MySQL’in bu özelliği kullanmasını sağlamak üzere bir noktaya dikkat etmekte fayda var.
// query cache kullanılmıyor
$r = mysql_query("SELECT isim FROM user WHERE dogum_tarihi >= CURDATE()");
// query cache kullanılıyor
$tarih = date("Y-m-d");
$r = mysql_query("SELECT isim FROM user WHERE dogum_tarihi > ='$tarih'");
Curdate() gibi sonucu belli olmayan fonksiyonlar kullanıldığı zaman query cache devreye girmiyor.
EXPLAIN kullanmak
Çoğu zaman karmaşık sorgular için “explain” kullanmak performansı artırabilir. Bunun sebebi EXPLAIN komutunun sorguları hızlandırması değil, sorgunun nasıl yapıldığını göstermesi. Bu sayede sorgunuzu gerektiği gibi optimize edebilirsiniz.
Özgün sonuçlarda LIMIT 1
Belirli durumlarda tek bir özgün sonuç arıyor olabilirsiniz. Ya da sadece WHERE koşullarına uygun kayıtlar olup olmadığını kontrol ediyor olabilirsiniz. Her iki durumda da LIMIT 1 kullanmak sorgu hızını arttırabilir.
// İstanbul'dan kayıt var mı?
// Kötüsü
$r = mysql_query("SELECT * FROM user WHERE sehir = 'İstanbul'");
if (mysql_num_rows($r) > 0) {
// ...
}
// daha iyisi
$r = mysql_query("SELECT 1 FROM user WHERE sehir = 'Istanbul' LIMIT 1");
if (mysql_num_rows($r) > 0) {
// ...
}
Bu durumda MySQL ilk sonuçla karşılaştığı zaman aramayı bırakacaktır.
ORDER by RAND() kullanmamak
Kısa ve temiz bir kod olmasına rağmen bu tarz bir sorgu çoğu zaman sorgu hızında problemlere yol açabilir. Bunun sebebi aranan her satır için RAND() fonksiyonun tekrar tekrar çağırılmasıdır. LIMIT 1 kullanılsa bile MySQL size tek bir satır vermeden önce muhtemel bütün satırlar için RAND() fonksiyonunu çağırarak işlemciyi yoracaktır.
// kötüsü
$r = mysql_query("SELECT isim FROM user ORDER BY RAND() LIMIT 1")
// iyisi
$r = mysql_query("SELECT count(*) FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0, $d[0] - 1);
$r = mysql_query("SELECT isim FROM user LIMIT $rand, 1");
Şimdilik bu kadar.



