Veritabanı Optimizasyonu

'Black Warrior

Yaşayan Forum Efsanesi
8 Ocak 2013
12,132
5
E5
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 bulunulmaktadır. 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.

?
View COde SQL

12345# 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.

?
View COde SQL

12# 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:

?
View COde SQL

12345# 1. YolALTER TABLE tablo_adi ADD INDEX index_adi (sutun1, sutun2, ...); # 2. YolCREATE INDEX index_adi ON tablo_adi (sutun1, sutun2, ...);

?
View COde SQL

12345# Ö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. ****TEXT INDEX’i kullanabilirsiniz.

?
View COde SQL

12345# Şarkı sözü tablomuzda sözlerin bulunduğu sütuna bunu ekliyoruz.CREATE ****TEXT 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ı.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.