Kategoriler
MySQL

MySQL Depolama Motorları (InnoDB vs MyISAM)

MySQL kullanan projelerde depolama motoru olarak yaygın şekilde MyISAM ve InnoDB isimli depolama motorları kullanılıyor. Bu yazımda MyISAM ve InnoDB depolama motorlarını inceleyerek projenize uygun seçimi yapmanızı sağlamaya çalışacağım.

Başlamadan önce bu konuda yeni olanların kafa karışıklığı yaşamaması için depolama motoru kavramına değinmem gerektiğini düşünüyorum.

Depolama motorları arasındaki temel fark isminden de anlaşılabileceği gibi verinin SQL’de tutulma yani depolanma mimarisinin farklılıklarından kaynaklanır. Bu farklılık temelde farklı türdeki verilerin depolanabilmesini sağlayabilmek içindir. Bununla birlikte farklı amaç ve avantajları vardır.

MyISAM

Eski ve artık geliştirilmeye devam edilmeyen ISAM motorunu temel alır ve yararlı uzantılar sunar.

Her MyISAM tablosu diskte 3 dosyada saklanır. Bu dosyalar tablo ile aynı adı taşır. Bu dosyalar;

  • .frm (Format) uzantılı dosya tablo biçimini saklar.
  • .myd (MyData) uzantılı dosya verileri saklamak için kullanılır.
  • .myi (MyIndex) uzantılı dosya ise indexleri saklamak için kullanılır.

MyISAM Limit ve Sınırları

Tablo başına maksimum dizin sayısı 64’tür.
Dizin sayısı başına maksimum sütun sayısı 16’dır.

Depolama sınırı 256TB’dır.

Bir tablodaki VARCHAR ve CHAR sütunlarının uzunluklarının toplamı 64KB’a kadar kadar olabilir.

MyISAM Depolama Motorunun Özellikleri

Tablo düzeyinden kilitleme yapar.

Maksimum anahtar uzunluğu 1000 bayttır. Bu, kaynak değiştirilerek ve yeniden derlenerek de değiştirilebilir. 250 bayttan uzun bir anahtar olması durumunda, varsayılan 1024 bayttan daha büyük bir anahtar blok boyutu kullanılır.

Silme işlemleri güncellemeler ve eklemelerle karıştırıldığında dinamik boyutlu satırlar çok daha az parçalanır. Bu, bitişik silinen blokları otomatik olarak birleştirerek ve bir sonraki blok silinirse blokları genişleterek yapılır.

MyISAM eşzamanlı eklemeleri desteklemektedir.

Data (DATA DIRECTORY) ve index (INDEX DIRECTORY) dosyaları farklı fiziksel disklerde ve farklı dizinlerde saklanabilir. Bu performansı artırabilir.

BLOB ve TEXT türündeki sütunlar indexlenebilir.

NULL değerlere dizinlenmiş sütunlarda izin verilir. Bu anahtar başına 0 ila 1 bayt alır.

Her sütunün farklı bir karakter seti kullanması mümkündür.

VARCHAR türü için gerçek bir destek sunar.

InnoDB

InnoDB, güvenlik ve performansı dengeli tutmayı hedefleyen genel amaçlı bir depolama motorudur.

InnoDB Limit ve Sınırları

Maksimum tablo limiti 256TB’dır.

Bir tablo maksimum 1017 sütun içerebilir.

Bir tablo en fazla 64 ikincil index içerebilir.

Çok sütunlu indexler için maksimum 16 sütuna izin verilir. Sınırı aşmak bir hata döndürecektir.

InnoDB Özellik ve Avantajları

Satır düzeyinde kilitlemeler ve Oracle stili okuma, çok kullanıcılı eşzamanlılığı ve performansı arttırır.

Birincil anahtara dayalı sorguları optimize etmek için verileri diskte düzenler. Her InnoDB tablonun, birincil anahtar aramaları için verileri düzenleyen, kümelenmiş dizin adı verilen bir birincil anahtar dizini bulunur.

InnoDB Mimarisi

SQL sunucusu donanım veya yazılım sorunu ile beklenmedik şekilde çalışmayı durdurursa tekrar çalışma anında her hangi bir şey yapmanız gerekmez.

Her tablo için uygun bir birincil anahtar sütunu tanımlamak, bu sütunu içeren sorguların otomatik olarak optimize edilmesini sağlar. WHERE, ORDER BY, GROUP BY gibi tümce ve birleştirme işlemlerinde birincil anahtara sahip sütunlara başvurmak çok daha hızlı sonuç verecektir.

Ekleme, güncelleme ve silme işlemleri otomatik olarak önbelleğe alınır ve optimize edilir.

Verilerin şifrelenmesini destekler.

Büyük veri hacimlerini işlerken CPU verimliliği ve performansı yüksektir.

MyISAM vs InnoDB

MyISAM eski bir mimari ile geliştirilmişken InnoDB daha yeni ve karmaşık bir mimari ile geliştirilmiştir.

MyISAM söz konusu bir okuma işlemi olduğunda son derece hızlıdır. Ancak aynı anda bir güncelleme, ekleme ya da silme işlemi yapılmak istenirse yanıt süresi uzayacaktır. Bu MyISAM’ın tablo bazında kilitleme yapmasıyla açıklanır. Buna karşılık InnoDB satır bazında kilitleme yaptığından dolayı tablo içerisinde farklı satırlara eşzamanlı okuma, yazma, düzenleme ve silme işlemine izin verir. Bu aynı zamanda veritabanın yük altında olduğu durumlarda InnoDB’nin daha kararlı çalışmasını sağlamaktadır.

InnoDB, MySQL kullanıcı verilerini korumayı, güvenli geri almayı ve kilitlenmede kurtarmayı sağlar ancak MyISAM ile karşılaştırıldığında biraz daha fazla disk alanı ve bellek kullanır. Bu durum InnoDB’nin MyISAM’a göre daha fazla önbellek teknoloji kullanmasından kaynaklanıyor.

Olası donanım ve yazılım kaynaklı kilitlenmelerden kurtarma konusunda InnoDB daha gelişmiştir. MyISAM böyle bir problem ile karşılaştığında, veri bütünlüğünü koruma konusunda oldukça yetersizdir.

MyISAM full-text search index’e sahipken InnoDB bunu desteklemez.

Güncelleme, ekleme ve silme işlemlerinin daha yoğun yapıldığı tablolarda InnoDB daha performanslıdır. Okuma işleminin daha yoğun gerçekleştiği tablolarda ise MyISAM daha hızlı yanıt verebilir.

MyISAM veri bütünlüğü kontrollerini desteklemez. Bu yüzden Bankacılık gibi kritik veri uygulamalarında kullanılamaz.

MyISAM transactions ve foreign keys desteği sunmaz.

InnoDB mi? MyISAM mı?

Hala hangisini kullanmanız gerektiği konusunda kararsızsanız en başta dikkat etmeniz gereken tabloda okuma işleminin mi yoksa düzenleme, ekleme ve silme gibi işlemlerin mi daha fazla yapılacağıdır. Çoğunlukla okuma işleminin yapılacağı bir tabloda MyISAM kullanmak daha uygunken, düzenleme ve silme gibi işlemlerin yoğunlukla yapılacağı tablolarda InnoDB tercih etmek daha uygundur.

Örneğin bir blog yapıyorsanız çoğunlukla okuma işlemi olacağından MyISAM daha doğru bir tercih olacaktır. Bir portal yapıyorsanız InnoDB daha iyi bir tercih olabilir. Ya da bankacılık işlemleri gibi kritik verilerin tutulduğu bir tabloda MyISAM kullanmak büyük sorunlara neden olabilir.

Yazar Muhammet ŞAFAK

1992 İstanbul doğumluyum. 2008 yılından beri profesyonel olarak PHP geliştiriyorum. Her ne kadar ağırlıklı olarak PHP üzerinde çalışsam da C, C++, Python, Java programlama dillerini de kullanıyorum.

Bir Cevap Yazın