Web teknolojileri ile ilgili teknik bir blog…

MySQL’de Performanslı Loglama

Sorun:

FotoKritik’te kullanıcının her bir hareketi kaydediliyor. Şu an için 7000 kullanıcının bile her hareketini loglamak oldukça “iri” bir tabloya sahip olmamıza neden oluyor. O yüzden son 1 ayın loglarını tutuyorduk sadece. O dosya içerisinde bile sorgu yapmak ölüm zira 1 ayda 5-6 milyon satır oluyor…

Çözüm:

Öncelikle, yüksek performansı sıkıştırılabilir olması nedeniyle log tabloları için MyISAM tablo türü seçilmeli. Her hafta sunucu yükünün az olduğu bir saate koyduğum cron betiği sayesinde log tablosunu log_hafta_# adlı bir tabloya aktarıp aktif log tablosunu boşaltıyorum. Burada # hafta numarası.

Daha sonra bu yeni yaratılan tabloyu myisampack ile sıkıştırıyorum. myisampack komutu tabloyu sıkıştırır ve salt okunur yapar. Daha sonra bu tabloları tek bir tablo gibi sorgulamak isterseniz MySQL’in merge tablo türünden yararlanabilirsiniz.

myisampack, MyISAM tablosunun data kısmını sıkıştırıyor, index ve tablo yapısının bulunduğu dosyalara dokunmuyor. Sorgu yapıldığı zaman indeksten datanın bulunduğu satırı bulup “sadece” o satırı decompress ediyor. Compressed tablo daha küçük olduğu için (%60 ~ %80) disk seek’i az oluyor, sadece o satır uncompress edildiği için de bütüne bakıldığında performans kazancı sağlanıyor.

Bu yöntemi kullanacaksanız testlerinizi mutlaka yedekli yapın!

Burada myisampack’in kullanımı çok önemli. Veri kaybınızın olmaması için önce tablonuzu repair komutuyla onarmanızı öneririm. Daha sonra myisampack ile sıkıştırın (ben myisampack -bwv ile sıkıştırıyorum), myisamchk -rq –sort-index –analyze ile indexleri tekrar yaratın ve mysqladmin flush-tables ile tabloları kullanılır hale getirin.

Bu yazıya gelen cevapları takip etmek için bu RSS 2.0 linkini kullanabilirsiniz.