Mysql Optimizasyonu

Veri deposu sunucularda verilerin en yoğun bulunduğu ve işlendiği servisler şüphesiz Veritabanları. Hal böyle olunca sunucu performansını etkileyen en önemli faktörlerden biri haline geliyor. Küçük bir veritabanınız varsa ve çok sayıda sorgulamanız söz konusu değilse dert etmeyebilirsiniz. Ama yoğun sorgular, okuma/yazma işlemleri söz konusuysa optimizasyon kaçınılmaz hale geliyor. 

Bu konu başlığında amacımız Mysql Veritabanımızı optimum düzeyde verimli hale getirmek olacak. 

Öncelikle kısa bir açıklama yapalım; Mysql içerisinde 500"e yakın işlevsel parametrenin bulunduğu komplike bir servistir. Ancak Mysql 5.5 altında bir versiyon kullanıyorsanız bu parametrelerin çok büyük bir kısmını değiştirmeniz mümkün olmuyor. Mysql 5.5 üzeri versiyonlarla çalışıyorsanız çok daha efektif çalışabiliyorsunuz. Evet, gelelim sunucumuzun canına can katacak parametrelere. 

Mysql optimizasyonu için tanımları my.cnf dosyası içerisine girmemiz gerektiğinden söz etmeye gerek yok sanıyorum. Başlayalım; 

innodb_buffer_pool_size = Ram Boyutu (GB) / 2 | Örn. 5G
En önemli parametredir. Mysql işlemleri için atayacağımız maksimum Bellek miktarını girmeliyiz. Toplam bellek miktarınızın %75"ini aşmamaya özen göstermeliyiz. Tüm kaynağımızı veritabanı tüketmemeli. 

innodb_buffer_pool_instances = Core Sayısı / 2
Veritabanımızın işlem kanalını tercih ediyoruz. Core sayısının yarısını referans alarak tanımlayabiliriz.

innodb_log_file_size = 64M
Bu değer yazma ağırlıklı çalışan veritabanları için performans arttıran bir tanımdır. Veritabanına eklenen verilerin log dosyasına yansımasını optimize eder. Yoğun bir yazma söz konusuysa bu değeri 512M değerine kadar çıkartabilirsiniz. Daha fazla arttırmak anlamlı olmayacaktır. 

innodb-file-per-table = 0
İşte Mysql"in performansını etkileyen çok önemli bir tanım. Çok sayıda ve büyük boyutlarda veritabanınız varsa tüm veritabanlarının döngülerini aynı ibdata içerisinde kullanmamız durumunda dosya boyutunun yükselmesi söz konusu olur. Eğer böyle bir durum yoksa ibdata sayısını arttırmanıza gerek yok. Ama büyük boyutlarda çok sayıda veritabanı çalıştırıyorsanız değeri 1 olarak değiştirebilirsiniz. 

innodb_flush_method = O_DIRECT
Varsayılan olarak tanımsız gelir. Yoğun bir veritabanı sirkülasyonumuz varsa belleği belli aralıklarla boşaltmakta fayda olabiliyor. O_DIRECT değeri bu dengelemeyi sağlıyor. Kısmen de olsa faydalı olabilecek bir tanımdır. 

max_connection = Ram Boyutu (GB) * 100
Evet, anlaşılacağı gibi kabul edilen en fazla bağlantı sayısını belirtiyoruz. Genellikle optimizasyon yaparken bu rakam afaki şekilde yükseltilir; 10.000 yapılır. Veritabanım cevap vermeyecekse sunucu zaten ne işe yarar diye düşünmeyin. Sunucunuzun cevap verebileceği maksimum bağlantı sayısını ön görmek zorundasınız. Bu rakamı aşarsa sunucunuz zaten kilitlenecek, haliyle girdiğiniz tanımın efektif bir karşılığı olmayacaktır. Ortalamayı dikkate alarak ilerleyelim; Ram (GB) kapasitenizi 100 ile çarpalım. Veritabanı yoğunluğunuza göre 100 çarpanının orantılı olarak düşürüp arttırabilirsiniz.

thread_cache_size =
8 + (max_connection/100)
Bu değer bize çok şey kazandıracaktır. Genel kabullerle yukarıdaki gibi bir hesaplamayı kullanabiliriz.

table_cache = (Tablo Sayısı / 100) * 2 | Örn. 4M
Bu değeri tanımlarken tablo sayımızı referans almalıyız. Veritabanlarımız içerisinde bulunan tabloların sayısını referans alarak her 100 tablo için 2MB bir değer kullanabiliriz. 


Şimdi etkisini bir anda görebileceğiniz, çok fazla hesaplama yapmadan ilk optimizasyonu yapabileceğiniz basit birkaç tanım verelim. Verim aldıkça yukarıdaki spesifik tanımları adım adım deneyerek geliştirebilirsiniz. 

Bu noktada bir Cache değeri tanımlayalım. Cache için 1GB"ızdan feragat edeceğiz diyelim. Şöyle hesaplıyoruz; 1x1024+1024 ve 1073741824 değerine ulaştık. 

Mysql"de şu komutu çalıştırıyoruz;

SET GLOBAL query_cache_size = 1073741824

my.cnf içerisine aşağıdaki satırları ekliyoruz;

query_cache_size = 1073741824
query_cache_type=1
query_cache_limit=1048576

Mysql servisini yeniden başlattıktan sonra birbirini tekrar eden sorguların yanıtları bellekte depolandığından tekrar eden sorgular için işlemciye yüklenmeyeceğiz. Mevcut mysql sunucuların %80"inde çok büyük fayda sağlayan bu konfigürasyon performans açısından en hızlı sonuç alınabilecek tanımları ihtiva ediyor diyebiliriz .

Son olarak PhpMyAdmin ile şu komutu çalıştırarak cache durumumuzu analiz edebiliriz.

Show status like "Qcache_queries_in_cache";


Makalenin sonunda ciddi bir performans artışı yaşamış olacağını düşünüyorum.