Bu makalede MySQL’i daha az yormak, sorguların işleniş zamanlarını kısaltmak, sitenizi hızlandırmak için birtakım veritabanı optimizasyonu tavsiyelerinde bulunacağım.
Eğer kendi kodlamalarınızla veritabanı kullanacaksanız birçok mysql sorgusu ile boğuşmak durumunda kalabilirsiniz. Kullandığınız tablolar çok fazla veri içerebilir. MySQL sunucusu bu verileri işlerken tüm veritabanındaki bilgileri kontrol etmek zorunda kalıyor olabilir. Şimdi ideal bir sorgu yapısını örnekleyelim:
1. Sadece gerekli sütunları sunucudan isteyin:
Tüm sütunları istemek demek, MySQL sunucusunun fazladan ve gereksiz veri göndermesi demektir. Örneğin bir tablodaki sadece başlık ve tarih kısmını kullanmamız gerekiyorsa bunu SELECT [sütunlar] bölümünde belirtmeliyiz.
# Yanlış Kullanım:
SELECT * FROM haberler LIMIT 0, 10;
# Doğru Kullanım:
SELECT baslik, tarih FROM haberler LIMIT 0, 10;
2. ORDER BY rand() kullanımından kaçının.
Gelen verilerin sırasını bildirmemize yarayan ORDER BY komutunun yanında eklenen rand() verilerin rastgele getirilmesini ister. Fakat bu özellikle binlerce kayıt bulunan bir tabloda sunucuya extra yük bindirir. Yaklaşık 120000 kayıtlı bir tabloda rand() kullanırsak en az 0.3 saniye sürecektir sorgumuz. Oysa ideal bir sorgu 0.001-0.005 ms harcamalıdır.
# Yanlış Kullanım:
SELECT * FROM sarki_sozleri ORDER BY rand() LIMIT 0, 10;
Eğer illa ki rastgele veri almak istiyorsanız, bu işi PHP’de de yapabileceğinizi unutmayın. Böylelikle yük MySQL’den kalkacaktır.
3. INDEX kullanın.
MySQL’de verileri hızlı bir biçimde sıralamak ve karşılığında gelen veriyi bulmak için INDEX yaratmalıyız. Özellikle en çok kullanılan sütunlar için INDEX yaratırsak sunucu daha az zamanda verileri bulacaktır:
İki yolla index ekleyebilirsiniz:
# 1. Yol
ALTER TABLE tablo_adi ADD INDEX index_adi (sutun1, sutun2, ...);
# 2. Yol
CREATE INDEX index_adi ON tablo_adi (sutun1, sutun2, ...);
# Örneğin aşağıdaki tarz bir sorguyu sıkça kullanıyorsak:
SELECT baslik FROM haberler WHERE dosya = "dosya_adi" AND kategori = "1";
# Aşağıdaki gibi bir index yaratma yoluna gidebiliriz:
CREATE INDEX l_dosya_kat ON haberler (dosya, kategori);
Böylelikle bu tarz sorgular daha az zaman harcayacaktır.
Eğer tablodaki CHAR, VARCHAR, TEXT gibi yazı içeren verilerde LIKE “%kelime%” tarzı aramalar gerçekleştiriyorsanız. FULLTEXT INDEX’i kullanabilirsiniz.
# Şarkı sözü tablomuzda sözlerin bulunduğu sütuna bunu ekliyoruz.
CREATE FULLTEXT INDEX l_sozler ON sarkisozleri (sozler);
# Ve eğer sözlerde arama yapacaksak bunu kullanmamız yeterli:
SELECT isim, soz FROM sarkisozleri WHERE MATCH(sozler) AGAINST('kelime');
Yukarıdaki örnek çalıştırılsaydı içinde “kelime” geçen tüm şarkı sözleri sorgu sonucu olarak yansıtılırdı.
Umarım sizlere faydalı olur bu yazı.
Unutmadan HTML Dersleri sayfamızdan sonra MySQL Komutları sayfamız da tamamlandı. Veritabanları ile ilgili yardım için bu siteyi kullanabilirsiniz.
Yazınıza ilave olarak önemli bir diğer konuda kelime (text)arama olayı var.
MySQL kullanan birçok kişi bu işlemi LIKE ‘%kelime%’ ile yapmaya çalışmakta fakat kelimeden önce % kullanıldığında (sonra kullanılanda sorun yok) MySQL “index”leri kullanamamakta.
Bunun için Full-Text Search yapmakta ve ve Full-Text arama yapılacak tabloları Full-Text ile indexlemek çok daha iyi.
Aslında “kötünün iyisi” diyelim.