Depoloma motorları, MYSQL’DE farklı tablo türleri için SQL işlemlerini yürüten MYSQL bileşenleridir. InnoDB, varsayılan ve en genel amaçlı depoloma motorudur. Oracle’da özel kullanım alanları dışında InnoDB kullanılmasını önerir. (MySQL 5.5’den itibaren varsayılan saklama motoru InnoDB’dir. Öncesinde varsayılan saklama motoru MyISAM’dır.)
Sunucunuuzn hangi depolama motorlarını desteklediğini belirlemek için SHOW ENGINES komutunu kullanabiliriz.
Tabloda gördüğümüz gibi bir çıktı elde ederiz. Buradaki sütun adlarını inceleyecek olursak;
- Engine : depolama motorunun adını içerir.
- Support : sürücümüz üzerinde desteklenip desteklenmediği içerir.
- Comment : depolama motoru hakkında kısa bir açıklama içerir.
- Transactions : transaction yapısını destekleyip, desteklemediği bilgisini içerir.
- XA : Koordinat tabanlı transaction işlemlerini destekleyip, desteklemediği bilgisini içerir.
- Savepoints : Yapılan işlemlerin geri alınmasına (rollback) yönelik kayıt noktaları (savepoints) oluşturmayı destekleyip, desteklemediği bilgisini içerir.
Depolama motorları belirli bir veritabanı tablosundan bilgi çekmeyi tabloda bilgi saklamayı ve tablodaki bilgiyi kontrol etmeyi sağlar.
MySQL sunucusunun mimarisi aşağıdaki şekilde verilmiştir. Verileri kalıcı olarak diske kaydeden, SQL sorgularını çalıştıran ve verileri diskten ya da bellekten derleyip getiren gerçekte depoloma motorlarıdır. Üstelik depoloma motorları eklenip çıkarılabilen bir yapıya sahiptir. MySQL için yazılmış özel kullanım alanları olan çok sayıda üçüncü parti depoloma motorları mevcuttur tokudb, aria.
MySQL 5.7 desteklenen depolama motorları aşağıdaki gibidir.
InnoDB
InnoDB, yüksek güvenilirliği ve yüksek performansı dengeleyen genel amaçlı bir depolama motorudur. MySQL 5.7’de, InnoDB varsayılan MySQL depolama altyapısıdır. Farklı bir varsayılan saklama motoru yapılandırmadıysanız, bir ENGINE = yan tümcesi olmadan bir CREATE TABLE deyimi yayınladığınızda bir InnoDB tablosu oluşturulur.
- İlişkiseldir. Foreign Key desteği vardır. Veri bütünlüğü sağlanır.
- Transaction özelliği vardır.
- Insert ve Update işleminde ilgili satır veya satırlar kilitlenip işlem yapılır. Aynı anda tabloda başka SQL işlemi yapılabilir. DML işlemleri, kullanıcı verilerini korumak için tamamlama, geri alma ve kilitlenme kurtarma özelliklerine sahip işlemlerle ACID modelini takip eder.
- InnoDB tabloları, birincil anahtarlara dayalı sorguları optimize etmek için verilerinizi disk üzerinde düzenler. Her InnoDB tablosunda, birincil anahtar aramaları için I/O işlemlerini en aza indirgemek amacıyla verileri organize eden kümelenmiş dizin adı verilen bir birincil anahtar dizini (index) bulunur.
Oracle, Sun’ı satın aldığında MySQL’i de satın almış oldu. Oracle, MySQL’i satın almadan daha önce InnoDB saklama motorunu geliştiren InnoBase firmasını satın almıştı. Bu nedenle Oracle, MySQL’i geliştirme taktiğini, InnoDB üzerine kurmuştur. Oracle,InnoBase üzerinden, MySQL’e yatırım yapmaya ve MySQL’i geliştirmeye devam ediyor. Satın almadan sonraki ilk sürüm olan 5.5 ve daha sonrasında çıkardığı 5.6 sürümlerinde çok sayıda yeni özellik geldi. Bu yeniliklerin önemli bir kısmının InnoDB ile ilgili ve başarımı arttırmaya yönelik olduğunu görüyoruz.
MyISAM
MyISAM, MySQL’in en eski veritabanı depolama motorudur. Bu tabloların küçük bir alanı vardır. Tablo düzeyinde kilitleme, okuma / yazma yüklerindeki performansı sınırlandırır; bu nedenle, genellikle Web’de ve veri depolama yapılandırmalarında sadece salt okunur veya çoğunlukla salt okuma yüklerinde kullanılır.
Avantaj;
- SELECT işlemleri için hızlıdır.
- Sunucu kaynaklarını daha az tüketir.
- Kısıtlayıcılığı az olduğu için başlangıç seviyesi projeler için iyidir.
Dezavantaj ;
- 4 GB data sınırı vardır.
- INSERT ve UPDATE işlemleri için yavaştır.
- Text tabanlı bir depolama sistemi olduğu için sunucu tarafında bozulma ihtimali daha yüksektir.
- Foreing key desteklemez. Bu yüzden tablolar arasında duruma göre bütünlük oluşturmak database ve
- SQL dışına yani programa/scripte kalır.
- Transaction desteği yoktur yani tabloların yedeğini tutmaz ve bir kaza olursa datalar geriye alınamaz.
- Table level lock yapısındadır. Yani işlem emri geldiğinde tüm tabloyu kilitler,
NOT: MyISAM ; tip tabloları için kullanabiliriz. Statik durumlarda InnoDB ye gerek yok. MyISAM ile Daha hızlı sonuç alırız.
Memory
Kritik olmayan verilerin hızlı şekilde aranmasını gerektiren ortamlarda hızlı erişim için tüm verileri RAM’de depolar.Bu motor eskiden HEAP motoru olarak biliniyordu.
InnoDB’nin memory’deki buffer pool yapısı ile veriyi memoryde saklamak ve transaction yapış ile veri kaybını minimize ettiği için daha genel amaçlı kullanım bunun yanısıra NDBCLUSTER ise dağıtık veri setleri için için key-value aramaları yapmamızı sağlar, tüm bunların sonucu olarakda Memory depoloma motoru kullanımı giderek azalmaktadır.
Oturum bilgileri, ziyaretçi sayaçları vb. önemsiz ve kaybedilmesi sonucu risk oluşturmayacak ayrıca küçük boyutlu, sunucu ram’inde fazla boyut kaplamayan verilerde hızlı işlem yapabilmek adına tercih edilebilir.
CSV : CSV motorunun seçildiği tablolarda veriler text dosyalarında virgül ile ayrılarak tutulur. CSV tabloları, verileri aynı formatta okuyan ve yazan komut dosyaları ve uygulamalar ile veri alışverişi yapmak için CSV biçiminde veri almanıza veya dökmenize izin verir. CSV tabloları için index oluşturulamadığından, normal çalışma sırasında verileri genellikle InnoDB tablolarında tutulur ve yalnızca içe aktarma(import) veya dışa aktarma(export) aşamasındayken CSV tablolarını kullanırsınız.
Archive : Archive depolama motoru, çok miktarda indekslenmemiş veriyi çok küçük bir alana depolayan özel amaçlı tablolar üretir. Adı üzerinde arşiv niteleği taşıyan verileri sıkıştırarak depolamak üzerine çalışır. Bu sayede indeks önemini taşımayan verileri arşivlerken alandan tasarruf edebilmemizi sağlar.
Blackhole : BLACKHOLE depolama motoru, verileri alan fakat depolamadan atan bir “kara delik” görevi görür. Linux’deki /dev/null benzeri. Veri çekme sorguları her zaman boş bir sonuç döndürür. Yani bu tablolar veri depolamak için değildir.
Bir kara delik (blackhole) tablosu oluşturduğunuzda, sunucu veritabanı dizininde bir tablo biçimi dosyası oluşturur. Dosya tablo adıyla başlar ve bir .frm uzantısına sahiptir. Tablo ile ilişkili başka bir dosya yoktur.
Dump benzeri dosyaları gerçek sisteme dahil etmeden önce bir blackhole oluşturulup, dump dosyasının içinde verilerden kaynaklı syntax hataları olup olmadığını test etmek gibi işlemlerde kullanabiliriz.
NDB (NDBCLUSTER) : Cluster veritabanları için kullanılan depoloma motorudur.
Merge : MyISAM tabloları birleştirmek için kullanılır.Yani birden fazla myisam tabloyu ,aynı kolon ismi,
aynı kolon sayılarına sahip olması şartıyla, tek tabloymuş gibi kullanmanızı sağlar. Burada önemli olan kısım tablolardaki kolon isimlerinin ve kolon sayılarının eşit olması ve tabloların engine’ninin Myisam olması.
Federated : FEDERATED Depolama Motoru MySQL 6.0.7 ile birlikte başlamıştır. Varsayılan olarak gelmeyen MySQL’in desteklediği bir diğer tablo yapısı da federated‘dir. Kelime anlamı olarak Birleşik Depolama Motoru anlamına gelir. Yerel bir sunucudaki veritabanı server ile uzak bir sunucudaki veritabanı server
arasında , clustering veya replication olmadan erişim sağlar.
Mysql server kurulumunda default olarak aktif gelmeyen bu Motoru kullanmak iÇin aktifleştirmeniz gerekmektedir. FEDERATED depolama motorunda datalar, uzak sunucudaki .FRM dosyalarında tutulur. Database server’imizin bir yedeğini de farklı bir makinede tutmak istediğimizi düşünürsek en pratik yöntem ikinci makinede tablolarımızla aynı şekilde tabloları federated olarak oluşturmaktır.
NOT : Tüm sunucu veya schema için aynı depoloma motorunu kullanmak zorunda değiliz. Herahngi bir tablo için istediğimiz depoloma motorunu kullanabiliriz.
MySQL ile sağlanan çeşitli depolama motorları farklı kullanım durumları göz önünde bulundurularak tasarlanmıştır. Aşağıdaki tablo, açıklama notları ile MySQL ile sağlanan bazı depolama motorlarına genel bir bakış sunmaktadır.
Özellik | MyISAM | Memory | InnoDB | Archive | NDB |
B-tree indeksi | Yes | Yes | Yes | No | No |
Yedek / point-in-time Kurtarma | Yes | Yes | Yes | Yes | Yes |
Cluster database support | No | No | No | No | Yes |
Kümelenmiş (Clustered) indeks | No | No | Yes | No | No |
Veri Sıkıştırma | Yes (note 2) | No | Yes | Yes | No |
Veri önbellekleme (caches) | No | N/A | Yes | No | Yes |
Veri Şifreleme | Yes | Yes | Yes | Yes | Yes |
Foreign key | No | No | Yes | No | Yes |
Full-text search indexes | Yes | No | Yes | No | No |
Coğrafi veri türü desteği | Yes | No | Yes | Yes | Yes |
Hash indeks | No | Yes | No | No | Yes |
Index önbellekleme (caches) | Yes | N/A | Yes | No | Yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | No | No | Yes | No | No |
Komut önbellekleme (Query cache support) | Yes | Yes | Yes | Yes | Yes |
Replication support (note 1) | Yes | Limited (note 8) | Yes | Yes | Yes |
Depolama limitleri | 256TB | RAM | 64TB | None | 384EB |
T-tree indeks | No | No | No | No | Yes |
Transactions | No | No | Yes | No | Yes |
Güncellenebilir Veri Sözlüğü (data dictionary) için istatistikler | Yes | Yes | Yes | Yes | Yes |
https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html
https://medium.com/@wdrleo/mysql-depolama-motorlar%C4%B1-ve-farklar%C4%B1-a22ad47c59fb
http://binkurt.blogspot.com.tr/2016/03/hangi-mysql-sunucusunu-kullanmalym.html
İyi Çalışmalar…
Mustafa Bektaş Tepe