MySQL Performansını Artırmak

Bazı zamanlar siteniz veya uygulamanızın bağlı olduğu veritabanları şişer veya sitenin/uygulamanın yavaşlamasına neden olur. Bu gibi durumların önüne geçmek için bildiğim küçük şeyleri yazayım dedim.

1. Limit

Çekeceğiniz, sileceğiniz veya güncelleyeceğiniz verinin adedini biliyorsanız limit kullanın, aksi taktirde tüm verilerde aynı işlemi yapmaya çalışması, veritabanınızı yorar ve biraz da RAM'i zorlar.

-- 1. Örnek:
select * from tablo_adi where id=1

-- bu sorguda, ID'sini bildiğiniz, yani sadece bir adet
-- veri olduğunu bildiğiniz bir veriyi çekerken sorguya
-- limiti belirtmeniz daha sağlıklı olur :
select * from tablo_adi where id=1 limit 1
delete from tablo_adi where id=1 limit 1
update tablo_adi set alan=alan_degeri, alan2=alan2_degeri where id=1 limit 1

select * from uyeler where email='eposta_adresi@domain.com' limit 1

-- 2. Örnek :
-- PHP'de 10 tane veriyi kullanacaksanız MySQL'den de 10
-- adet veri isteyin, fazlası zaten boşuna MySQL'e yüktür
select * from tablo_adi limit 10

Limitleme olayı aslında ne kadar basit görünse de çok önemlidir. 100-200 tane veriniz varsa hız farkı yaratmaz fakat yüzbinlerce veri olan bir tabloda harikalar yaratabilir ;)

 

2. Veritipleri

Veritipleri benim gözümde limit'den daha önemli ve daha çok dikkat edilmesi gereken bir konudur. Veritipini seçerken dikkatli düşünmeli ve doğru kararlar alınmalıdır. Örneğin ad soyad, şifre, e-posta adresi gibi verileri tutacağınız alana `text` veritipini girmek çok büyük bir yanlıştır. Onun yerine varchar kullanmak daha sağlıklı olur.

Aynı şekilde - eğer illeri tutacağınız bir tablo oluşturuyorsanız; kaç adet ilimiz olduğunu biliyorsunuz, bunun doğrultusunda bir veritipi seçmelisiniz.

Unsigned'ın önemi

Unsigned, sayısal veritiplerinde görünen bir attribute'dur. Seçili iken sadece pozitif sayıları, değil ise negatif ve pozitif sayıları tutabilirsiniz. Örneğin tinyint signed iken -128 ile 127'ye kadar değer alabilir. Unsigned'ken; 0 ile 255 arası bir değer alabilir. Detaylı bilgi için buraya bakabilirsiniz

 

3. Asterisk (*) Kullanımı

Okuma sorgularında sadece tüm field'ları kullanmayacaksanız sadece belirli field'ları isteyin; böylece ağa daha az veri trafiği kullanmış olursunuz. Fakat tüm fieldlara ihtiyacınız varsa pek büyük bir performans farkı olmaz.

Örneğin; "ad, soyad, email, sifre, yetki, onay, kayit_tarihi" fieldlarına sahip "test_tablo" isimli bir tablodan sadece ad, soyad ve email fieldlarını okuyacaksanız;

-- performanssal olarak yanlis kullanim
select * from test_tablo;


-- performanssal olarak dogru kullanim
select ad, soyad, email from test_tablo;

 

MySQL