İçeriğe geç
Muhammet Şafak
Araçlar & Teknolojiler 4 dk okuma

MySQL Depolama Motorları (InnoDB vs MyISAM)

MySQL depolama motorları: InnoDB ile MyISAM arasındaki farklar, avantajlar ve hangi durumda hangisi seçilmeli?


MySQL’de tablo oluşturduğunuzda arka planda bir depolama motoru çalışır. Depolama motoru, verinin diske nasıl yazıldığını, okunduğunu, kilitlerin nasıl yönetildiğini ve transaction desteğinin olup olmadığını belirler. MySQL 5.5’ten itibaren varsayılan motor InnoDB; ancak eski projelerde hâlâ MyISAM tablolarla karşılaşmak mümkün. Bu ikisini anlamak, özellikle performans sorunu yaşayan veya miras kalmış bir sistemi devralan birinin işine doğrudan yarıyor.

Kısa yanıt: 2021’de yeni proje başlıyorsanız InnoDB kullanın. Ama “neden” sorusunu yanıtlamak daha öğretici.

MyISAM: hız odaklı, sade tasarım

MyISAM, ISAM motorunun genişletilmiş halidir. Tasarımı nispeten basit; bu basitlik beraberinde hem avantaj hem sınırlama getiriyor.

Her MyISAM tablosu diskte üç dosya olarak tutulur:

  • .frm — tablo yapısı
  • .MYD — satır verileri
  • .MYI — indeksler

Bu ayrımın pratikte bir faydası var: veri ve indeks dosyalarını farklı fiziksel disklere yerleştirip I/O yükünü dağıtabilirsiniz. Ama bu avantaj, çoğu modern kurulumda SSD ve RAID ile zaten anlamsız hale geldi.

MyISAM’ın sınırları

Tablo düzeyinde kilitleme MyISAM’ın en büyük zayıf noktası. Bir yazma işlemi başladığında tüm tablo kilitlenir; diğer okuma ve yazma istekleri bekler. Düşük eşzamanlılık gerektiren senaryolarda bu sorun değil; ama aynı tabloya birden fazla yazma işlemi geldiğinde yanıt süreleri hızla uzuyor.

Transaction ve foreign key desteği yok. Bu, MyISAM tablolarında birden fazla sorgunun atomik olarak çalışmasının mümkün olmadığı anlamına gelir. Yarım kalan bir işlemi geri alamazsınız.

Donanım veya yazılım kaynaklı beklenmeyen bir çöküşte MyISAM tabloları bozulabilir. REPAIR TABLE ile düzeltme mümkün ama garanti değil. InnoDB’nin crash recovery mekanizması bu senaryoyu otomatik olarak çözüyor.

MyISAM’ın avantajı kaldı mı?

Full-text search desteğini MyISAM çok erken sundu. Ama MySQL 5.6’dan itibaren InnoDB da full-text search’ü destekliyor; dolayısıyla bu fark büyük ölçüde kapandı. Geriye kalan tek gerçek avantaj: çok yoğun okuma ve neredeyse hiç yazma olmayan, kilitlenme ve bütünlük sorunu yaşanmayan tablolarda MyISAM hafif ölçüde daha hızlı olabilir. Bu da bugün çoğu uygulama için anlamlı bir fark değil.

InnoDB: sağlam zemin

InnoDB, güvenlik ve performansı dengeleyen genel amaçlı bir motordur.

Satır düzeyinde kilitleme

InnoDB satır bazında kilitler. Aynı anda farklı satırları güncelleyen iki sorgu birbirini beklemez. Yoğun eşzamanlı yazma gerektiren uygulamalarda — sipariş işleme, kullanıcı güncelleme, stok yönetimi gibi — bu fark doğrudan ölçülebilir.

Transaction desteği

InnoDB, ACID uyumlu transaction desteği sunar. Birden fazla sorguyu atomik bir birim olarak işleyebilirsiniz:

START TRANSACTION;

UPDATE hesaplar SET bakiye = bakiye - 500 WHERE id = 1;
UPDATE hesaplar SET bakiye = bakiye + 500 WHERE id = 2;

COMMIT;

Herhangi bir noktada hata oluşursa ROLLBACK ile her şeyi geri alabilirsiniz. Bu özellik olmadan finansal işlemler, sipariş akışları veya tutarlılık gerektiren herhangi bir senaryo güvenli biçimde modellenemez.

Foreign key ve referential integrity

InnoDB, foreign key kısıtlamalarını uygular. Bu, veritabanı düzeyinde veri tutarlılığı sağlar; uygulama katmanında unutulan bir kontrol veritabanını tutarsız bırakamaz.

Clustered index mimarisi

InnoDB her tablonun verilerini birincil anahtara göre sıralı olarak depolar. Bu yapıya clustered index deniyor. Birincil anahtarla yapılan sorgular doğrudan doğru sayfaya gider; ek bir indeks araması gerekmez. WHERE, ORDER BY ve JOIN işlemlerinde birincil anahtar sütunları kullanıldığında bu mimari belirgin kazanım sağlıyor.

MySQL InnoDB depolama motorunun mimarisi

Crash recovery

InnoDB, değişiklikleri commit etmeden önce bir redo log’a yazar. Beklenmeyen bir çöküş sonrasında MySQL yeniden başladığında bu logu kullanarak son tutarlı duruma geri döner. Manuel müdahale gerektirmez.

Bellek kullanımı

InnoDB, buffer pool mekanizmasıyla hem veriyi hem indeksleri bellekte tutar. Bu, disk I/O’yu azaltır ve sık erişilen verilerin yanıt süresini düşürür. Bedeli: MyISAM’a kıyasla daha fazla bellek tüketir. Küçük sunucularda buffer pool boyutunu innodb_buffer_pool_size ile ayarlamak önemli; bu değer genellikle toplam RAM’in %70-80’i olarak önerilir.

Karşılaştırma

ÖzellikInnoDBMyISAM
TransactionVarYok
Foreign keyVarYok
KilitlemeSatır düzeyindeTablo düzeyinde
Crash recoveryOtomatikManuel onarım gerekebilir
Full-text searchMySQL 5.6+Eski sürümlerde de var
Bellek kullanımıDaha fazlaDaha az
Okuma ağırlıklı yükİyiÇok hafif avantaj
Yazma ağırlıklı yükBelirgin üstünlükYetersiz

Hangi motor, ne zaman?

InnoDB: Transaction, foreign key veya eşzamanlı yazma gerektiren her senaryo için. Bugün yeni tablo yaratıyorsanız varsayılanı değiştirmeyin; InnoDB doğru seçim.

MyISAM: Nadir bir senaryo kaldı: çok eski MySQL sürümleri (5.5 öncesi) veya çok özel read-only önbellek tabloları. Bunlar dışında MyISAM’a yeni tablolarda yer açmamak gerekiyor.

Mevcut bir projede mevcut tabloların motorunu SHOW TABLE STATUS ile görebilirsiniz:

SHOW TABLE STATUS FROM veritabani_adi\G

MyISAM tabloları InnoDB’ye dönüştürmek için:

ALTER TABLE tablo_adi ENGINE = InnoDB;

Bu dönüşümü büyük tablolarda maintenance penceresi planlanarak yapmak gerekiyor; işlem süresince tablo kilitlenebilir.


MySQL’in InnoDB’yi varsayılan yapması tesadüf değil. Kilitleme modeli, crash recovery ve transaction desteği, modern uygulamaların beklediği temel garantileri karşılıyor. MyISAM’ın “daha hızlı okuma” argümanı ise bugün çoğu durumda ölçülebilir bir fark üretmiyor. Eski bir projeyi devralıyorsanız ve tablolarda MyISAM görüyorsanız, dönüşümü ertelemenin ciddi bir nedeni olmadıkça InnoDB’ye geçmek makul bir adım.

Etiketler: #MySQL
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi