MySQL ipuçları

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. :)

CHM dosyalarını görüntülemek

CHM (derlenmiş yardım dosyası) dosyalarını Internet’ten indirip (ya da başka bir kaynaktan) açmak istediğiniz zaman “Navigation Cancelled” gibi bir uyarı alıp sayfanın görüntülenmediğini farkedebilirsiniz.

Aslında çözümü oldukça basit. Dosyanın üzerine sağ tıklayıp özellikler seçeneğine girdiğiniz zaman dosya özelliklerin hemen altında bir “unblock” düğmesi göreceksiniz. Buna basarak .chm dosyasını artık rahatlıkla okuyabilirsiniz.

Windows’un güvenlik uygulamasına bir örnek!

Google Translate artık Türkçe’ye çeviriyor

Google’ın çeviri hizmeti veren servisi Google Translate desteklediği diller arasına Türkçe’yi de ekledi. Ama çevirilerin pek doğru dürüst olduğunu söylemek pek zor. Çeviriler kelime bazında çoğu zaman düzgün olsa da bir paragraf girdiğiniz zaman sonuç biraz abuk sabuk olabiliyor.

İşte bir örnek:
A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair.

Ortak bir hata, insanların ne zaman bir şey tamamen kusursuz tasarımı çalışırken yapmak tam aptallar ve marifet hafife etmektir.
Bu ve büyük olasılıkla yanlış olmadan bir şey yanlış olabilir bir şey arasındaki en önemli fark, o büyük olasılıkla yanlış olmadan bir şey geçerli olup çoğunlukla tamir veya alırken imkansız çıkabilir yanlış.

Yazılımcılar için

Proglama kitaplarımdan birinde şu alıntıya rastladım. Herhalde yazılım geliştiren kişiler (hatta bir şey yaratanlar) bu alıntıyı konu ile oldukça ilgili bulacaklardır. Burada paylaşıyorum.

“A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.”
“The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair.”
—Douglas Adams, Mostly Harmless

IronKey – Kendini yok USB bellek

IronkeyUSB bellekler günümüzde son derece yaygın ve kullanışlı şeyler. her gün ucuzlayan fiyatları, artan kapasiteleri ve değişik çeiştleri ile bilgisayar kullananlar için neredeyse vazgeçilmez bir ürün haline geldiler. Gigabytelarca veri cebinizde ve hemen her yerde ulaşılmaya hazır durumda. Tabii durum böyle olunca yavaş yavaş bir güvenlik sorunu da ortaya çıktı. İnsanlar kişisel, hatta bazen şirketlerle ilgili bilgilerini bile bu USB belleklerde tutmaya başladılar. Ama USB belleklerin çok büyük bir dezavantajı var; her an kaybolabilirler. Veya kolayca çalınabilirler. Siz daha farkına bile varmadan içindekiler (size ait özel dosyalar, resimler)kopyalanabilir.

IronKey tüm bunlara çözüm. Okumaya devam etmek içi tıklayın.

DRM’ın son kalesi de yıkılıyor

Down with DrmKullanıcıların bilgisayarlarına gizli programlar yükleyen rootkitler ile DRM‘ın en büyük savunucularından bir olan SONY’de en sonunda DRM içermeyen müzik parçalarını satacağıını açıkladı. Müzik sektörünün en büyük dört firmasından üç tanesi, EMI, Vivendi Universal ve Warner daha önce DRM içermeyen daha kullanıcı dostu müzik satışlarına yöneldiklerini açıklamışlardı. Gelişmeler karşısında dayanamayan ve DRM’ın deyim yerindeyse en fanatik savunucusu olan Sony’de bu firmaları takip edecek.

Bakalım bu hareket gerilemekte olan müzik endüstrisine nefes aldıracak mı?