Web geliştiricilerin sürekli olarak karşılaştığı fakat çok fazla üzerinde durma ihtiyacı hissetmediği bu konuya değinmek istedim. Konu başlığından da anlaşılacağı üzere MySQL Depolama Motorları, bir tablo oluştururken bize seçmemiz için bir alan halinde gelip birkaç farklı motor arasında seçim yapmamıza olanak sağlar.
MySQL Depolama Motorlarını bir liste halinde vermek gerekirse;
|Depolama Motoru
|Kısa Açıklaması
|CSV
|Veriler SQL ve non-SQL ortamlarda kolaylıkla aktarılır.
|InnoDB
|Hız ve performanstan ödün vermez ve MySQL işlemlerinin doğruluğuna etki eder.
|MEMORY
|Verileri RAM'de depolar. Bu sebeple çok hızlıdır. Lakin sunucu kapatılırsa veriler kaybolur. Geçici veriler için idealdir.
|MyISAM
|256TB'a kadar destekler. Sıkıştırma, hız ve farklı işletim sistemleri için optimize edilmiş depolama türüdür.
|MRG_MyISAM
|MyISAM ile oluşturulmuş ve birbiriyle aynı sütunlara sahip iki tabloyu birleştirmek ve tek bir tablo gibi görüntüleyebilmek için kullanılır. Özdeş tablolar ile oluşturulabilecek ortak bir tablo denilebilir.
Yukarıdaki tablomuzda temel olarak kullanılan Depolama Motorları hakkında bilgilere ulaşabilirsiniz. Şimdi bu depolama motorları arasında en çok tercih edilen InnoDB ve MyISAM depolama motorlarını ayrı ayrı inceleyeceğiz ve MEMORY depolama motoru hakkında da bir takım bilgilendirmelerde bulunacağız.
1. CSV
CSV depolama türünde depolanan veriler bir .txt dosyasında tutulurlar. Otomatik arttırmaya yarayan AI (Auto Increment) özelliğini desteklemez. Örneğin veritabanımızda aşağıdaki gibi bir veri kaydetmiş olalım.
Bu tablomuzun CSV formatında dışa aktarılmış dosyasını açtığımızda karşımızda şöyle bir çıktı görüntüleyeceğiz.
Yani anlaşıldığı üzere çıktılarımız virgül ile ayrılıyorlar. Aynı şekilde birden fazla veri eklediğimizde ise sonuç şöyle oluyor;
Alt alta birden fazla satır bizleri karşılıyor.
2. InnoDB
InnoDB, yüksek güvenlik ve performans ile çalışan ve şahsen diğer depolama motorları ile karşılaştırıldığında (kullanım yerlerine göre farklılıklar gösterebilir) en çok tercih edilen depolama motorudur. İlişkisel olmasının yanında Foreign Key desteği de bulunmaktadır. Yapılan işlemleri geri alma şansınız vardır. Bu da aslında bir geri yükleme noktasına benzetilebilir. Bunu transaction olarakta ifade edebiliriz (Bknz: Transaction Nedir?). 64TB'a kadar depolama sağlayabilir. Insert veya Update gibi işlemlerde satırlar kilitlenerek işlemler yapılır. Bu da demek oluyor ki aynı anda birden fazla SQL sorgusunu aynı tablo üzerinde gerçekleştirebiliriz. Sistem olarak daha fazla kaynağa ihtiyaç duymasının sebebi ise daha büyük projelerde kullanılmak için oluşturulmasıdır. Yani büyük boyutlu veritabanlarında stabil bir şekilde çalışabilir. Geospatial veri tipini destekler ki bu da dünya üzerindeki bir noktayı enlem ve boylam bilgileri ile depolama şansını bizlere sunar, kısaca koordinatları depolamamızı sağlar. Küme veritabanı desteği ve B ve T Tree Indeksleri destekler. Full Text Arama desteklemez.
3. MEMORY
Memory veritabanına özellikle değinmek istememin bir sebebi elbette var. Bu veri depolama motoru aslında veriyi RAM'de depoluyor. Bildiğiniz üzere bellekte depolanan veri, depolama aygıtlarında depolanan veriden çok daha hızlı ulaşılabilir ve kullanılabilirdir. Nasıl ki bilgisayarlarımızda bir program üzerinde çalışmak istediğimizde program önce belleğe taşınır sonra bizlere sunulur ve bu sayede hızlı olursa MEMORY veri depolama motoru da aslında bir anlamda benzetilebilir. Fakat bu depolama motorunun dez avantajı veriyi depolama aygıtından getirmemesidir. Yani veriyi doğrudan RAM (bellek)'de saklar. Bu sebeple eğer sunucu resetlenir veya kapatılıp açılırsa tüm bu tabloya ait veriler sıfırlanacaktır. Peki neden bu depolama motorunu kullanmalıyız diye soracak olursanız kullanıcılardan alınan verilerin geçici olarak tutulması gerekiyorsa, veya anlık olarak alınan verilerin gün içerisinde belli zaman dilimlerinde sizin veya makinenin otomatik olarak farklı bir tabloya taşımasını düşünüyorsanız kesinlikle tercih edilmelidir. Yani kayıtlar ilk olarak hızlı olması açısından MEMORY veri depolama türüne sahip tabloya kayıt edilir. Akabinde ise bu tablodaki veriler gerçek bir tabloya taşınır. Bu taşıma işlemlerini belirli periyotlarda sizler yaparsanız kullanıcı gerçekleştirdiği esnada işlem hızlı olmuş olur. Lakin bu depolama motorunda önemli bilgileri saklamanın doğru olacağını düşünmüyorum. Sorun güvenlik değil elbette, sorun bu bilgilerin gerçekleşecek bir hatada gitmesini istemememiz.
4. MyISAM
Günümüzde InnoDB tercihinin sunulmasının ardından ne yazık ki artık eskisi kadar kullanıldığını söyleyemeyiz. Sıkıştırılmış MyISAM tablolarının okunma işlemlerini gerçekleştirmek için yine sıkıştırılmış satır biçimini kullanmamız gerekir. Bu da aslında tabloların salt okunur bir biçimde karşımıza çıktığının bir göstergesidir. Geospatial veri tipini destekler. 256TB'a kadar veri depolamamıza olanak verir. Küme veritabanı desteği bulunmamaktadır. B-Tree indeksleri desteklerken T-Tree indeksleri desteklemez.Foreign Key desteği bulunmamaktadır. Veri önbellekleme seçeneği yoktur. Kısaca, innoDB'den önce tercih edilebilecek en iyi veri depolama motoru olarak bilinmektedir fakat innoDB'nin gelişinden sonra tüm bu özellikleri taşımasının yanında ekstra alternatiflere de sahip olması sayesinde innoDB, MyISAM'a göre daha fazla tercih edilesi hale gelmiştir. Full Text Arama destekler. MyISAM'da veri girişi sağlanırken bir sıralama söz konusudur. Yani aynı anda iki veri girişi yapamaz, ikinci girdiyi sıraya alır. Eğer sıkça SELECT sorgusu yapmanız gerekecek ise MyISAM hala tercih edilebilir bir depolama motorudur. Lakin eğer aktif olarak INSERT, UPDATE işlemlerini de yaptıracaksınız bir süre sonra MyISAM kendine ek yük oluşturur ve belirli periyotlarda optimizasyona ihtiyaç duyar. Yani INSERT ve UPDATE gibi işlemleri sıklıkla yapacaksanız tercihiniz innoDB olmalıdır.
5. MRG_MyISAM
Merge Depolama Motoru olarak da bilinen MRG_MyISAM, özdeş olarak tabir edilen ve açıkça birbiri ile aynı sütunlara sahip olan iki MyISAM depolama türüne sahip tabloyu birleştirmek için kullanılmaktadır. Merge ifadesinden anlaşılacağı üzere bir birleştirme işlemidir. Burada sütunların sırası dahil olmak üzere en ufak farklılık MRG_MyISAM depolama motorunun işlevini yapamayacağı anlamına gelmektedir. Temel işlevi birbiri ile neredeyse tüm özellikleri aynı olan iki MyISAM depolama türüne sahip tabloyu birleştirerek tek bir tablo gibi kullanılabilmesini sağlamaktır. "Bunu nasıl yapmakta?" diye soracak olursanız kısaca;
- 1. Tablomuz, MyISAM depolama motorunu kullanıyor. Tablo adımız: istanbulilceleri
- 2. Tablomuz, MyISAM depolama motorunu kullanıyor. Tablo adımız: ankarailceleri
AMAÇ: Hem İstanbul'un ilçelerini hem de Ankara'nın ilçeleri kullanabileceğimiz bir tabloya ihtiyacımız var.
İŞLEM: Eğer MRG_MyISAM kullanarak ilceler adında bir tablo oluşturup bu iki tabloyu birleştirirsek yeni bir tablo elde etmiş ve iki tablodaki verilere de erişebilmiş oluruz. Burada yeni oluşturduğumuz ilceler tablomuz gözükecek fakat sorgu yapıldığında sonuçta tüm illere ulaşabileceğiz.
innoDB vs MyISAM
Hiçbir ayarımızı değiştirmeden birebir aynı özellik ve içeriklere sahip, tek farklı depolama türleri olan MyISAM ve innoDB iki tane tablo oluşturduk. Boyutlarındaki farkı aşağıdan görüntüleyebilirsiniz.
Hangisini tercih etmeliyim?
Güvenlik: Eğer güvenlik ön planda olması gerekiyorsa innoDB tercih edilmesi gereken depolama motorudur.
Anlık Kayıt: Eğer aynı anda birden fazla sorgu oluşturulacaksa (CRUD: Creat, Read, Update, Delete) innoDB tercih edilmelidir. Çünkü innoDB aynı anda birden fazla kayıt yapmaya izin verirken MyISAM yeni gelen kaydı sıraya ekler.
Full Text Araması: Eğer Full Text araması yapılacak ise tercih edilmesi gereken depolama motoru MyISAM olmalıdır. Zaten innoDB Full Text aramasını desteklemez!
Boyut: Eğer yerden tasarruf edilmesi gerekiyorsa tercih edilmesi gereken depolama motoru görselde de görüldüğü üzere MyISAM olmalıdır. Çünkü innoDB daha fazla sistem kaynağı tüketmektedir ve boyutu fazladır.
Kurtarma: Sistemde çıkabilecek aksilikleri göz önüne aldığımızda innoDB geri dönüş imkanı vermektedir. Buna karşın MyISAM sistem sorunlarına karşın kurtarma işleminde daha zayıftır.
Tasarım: Tasarım aşamasında diğerine göre daha basit olan MyISAM'dır. Lakin kodlama yapacak kişiler göz önüne alındığında innoDB'nin kodlama açısında daha fazla kolaylık sağlayacağı doğrudur.