MySQL Depolama Motorları ve Farkları

Çoğumuzun hiç üstünde durmadan geçtiği depolama motorları (storage engines) ve farklarına değineceğim.

Öncelikle kullandığımız MySQL sürümü ve optimizasyonunda aşağıdaki SQL sorgusunu çalıştırarak veri tabanımızın hangi depolama motorlarını desteklediğini öğrenelim.

SHOW ENGINES

Output:

1.0 depolama motorlarının sorgulanması sonucu alınan örnek bir çıktı

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.

1 .1 — FEDERATED Motoru

Federated depolama motoru, çoğaltma veya küme teknolojisi kullanmadan uzak bir MySQL veri tabanındaki verilere erişmenizi sağlar. Yerel bir federated tablosu sorgularken, veriler otomatik olarak uzaktaki (federe edilmiş) tablolardan çekilir. Yerel tablolarda hiçbir veri depolanmaz.
 — dev.mysql

MySQL’in kendi sitesinden edindiğimiz bu bilgiden sonra aslında bu motor üzerinde çok fazla değinilecek bir konu yok. Varsayılan olarak kapalı bir şekilde geliyor. Kullanabilmek için MySQL servisinin uzak bağlantıya açık olması ayrıca verinin asıl kaynağı olarak belirtilecek sunucuda da uzak MySQL sunucu (Remote MySQL) ayarları yapılandırılmış olmalıdır.

Federated motorunu etkinleştirmek için kullandığınız sisteme göre my.ini yada my.cnf MySQL ayar dosyasına girerek [mysqld] ayarları altına

federated

opsiyonunu ekliyoruz. Ayrıca TCP/IP ayarları kısmında da skip-federated özelliğini aşağıdaki gibi yorum satırına dönüştürmemiz gerekiyor.

#skip-federated

Yeniden veri tabanı motorlarını sorgulayıp çıktısına baktığımızda görüyoruz ki artık federated motoru desteklenebilir durumda oluyor.

Tablo oluştururken oluşturduğumuz tablonun motorunu federated yaptığımızda Bağlantı adıyla bize bağlanacağı uzak sunucu bilgilerini soruyor.

Bağlantı alanına eklenecek verinin formatı;

scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name

1.2 — MRG MyISAM (Merge MyISAM) Motoru

MRG_MyISAM motoru olarak da bilinen merge depolama motoru, özdeş MyISAM tablolarının bir koleksiyonu olarak kullanılabilir.
"Özdeş", tüm tabloların aynı sütun ve indeks bilgilerine sahip olduğu anlamına gelir. MyISAM tablolarını, sütunların farklı bir sırada listelendiği, tam olarak aynı sütunlara sahip olmadığı veya dizinleri farklı sırayla birleştiremezsiniz. Bununla birlikte, MyISAM tablolarının herhangi biri veya tümü myisampack ile sıkıştırılabilir. AVG_ROW_LENGTH, MAX_ROWS veya PACK_KEYS gibi tablo seçenekleri farklı değildir.
 — dev.mysql

Sütun adları, türü, boyutu, bulunduğu sıra vb. tüm özellikleri aynı iki farklı tabloyu kullanarak tek tablo üzerinden verilere erişmek için kullanılan bir türdür. Özdeş tablolar MyISAM depolama motoruyla oluşturulmuş olmalıdır. Özdeş tablolardan türetilecek ortak tablo ise MRG_MyISAM depolama motoru ile oluşturulur.

Örnek:
“t1” ve “t2” adında iki özdeş MyISAM motoruna sahip tablo oluşturuyoruz.
İkisine de farklı veriler ekliyoruz.

mysql> CREATE TABLE t1 (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> CREATE TABLE t2 (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> message CHAR(20)) ENGINE=MyISAM;
mysql> INSERT INTO t1 (message) VALUES ('Testing1'),('table1'),('t1');
mysql> INSERT INTO t2 (message) VALUES ('Testing2'),('table2'),('t2');

Şimdi MRG_MYISAM motorunu kullanarak bu iki tabloyu birleştireceğimi bir total tablosu oluşturalım.

mysql> CREATE TABLE total (
-> id INT NOT NULL AUTO_INCREMENT,
-> message CHAR(20), INDEX(a))
-> ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

Veriler total tablosu üzerinde tutulmayacak ancak biz total tablosu üzerinden bir sorgulama yaptığımızda t1 ve t2 tablolarının ikisinde birden işleme alınacak.

Şimdi örnek olarak bir select sorgusu çalıştıralım ve sonucu görelim;

mysql> SELECT * FROM total;
+---+----------+
| id| message |
+---+----------+
| 1 | Testing1 |
| 2 | table1 |
| 3 | t1 |
| 1 | Testing2 |
| 2 | table2 |
| 3 | t2 |
+---+----------+

Eğer MRG_MYISAM tablosunun kaynaklarını değiştirmek isterseniz tablonun kaldırılıp yeniden oluşturulması gerekmektedir. MRG_MYISAM tablosunu oluşturmadan önce uyumluluk dikkatli bir şekilde incelenmelidir. 
İncelenmesi gereken uyumluluk şartları;

  • Birleştirilecek iki tabloda da aynı isim ve sayıda sütun olması gerekir.
  • Birleştirilecek iki tablodaki sütunların sıralaması aynı olmalıdır.
  • Birleştirilecek iki tablodaki sütunların türleri aynı olmalıdır.
  • Birleştirilecek iki tablodaki alan uzunlukları veya değerleri aynı olmalıdır.
  • Birleştirilecek tablolar veri açısından hiçbir veri içermiyor yani boş olabilir.
  • Birleştirilecek iki tabloda aynı dizgeye sahip olmalıdır. Yani primary özellikteki bir alan diğer tabloda da primary, index atanmış bir alan diğer tabloda da aynı değerlerde index’e sahip olmalıdır.

1.3 — MyISAM Motoru

MyISAM’ın temeli eski (ve artık kullanılmayan) ISAM depolama altyapısına dayanmaktadır ancak birçok kullanışlı uzantısı vardır.
 — dev.mysql
1.3.1 MyISAM desteklenen özellikler
  1. Sıkıştırılmış MyISAM tabloları yalnızca sıkıştırılmış satır biçimini kullanırken desteklenir. Sıkıştırılmış satır biçiminin kullanıldığı MyISAM tabloları salt okunurdur.
  2. Sunucuda (şifreleme işlevleri aracılığıyla) uygulanmaktadır. Dinlenme esnasında tablolama şifrelemesi, MySQL 5.7 ve üzeri sürümlerde mevcuttur.
  3. Depolama alt yapısı yerine sunucuda çalışır.
Her MyISAM tablosu diskte üç dosya halinde saklanır. Dosyalar, tablo adı ile başlayan ve dosya türünü belirtmek için bir uzantıya sahip adlara sahiptir. Bir .frm dosyası tablo biçimini depolar. Veri dosyasının bir .MYD (MYData) uzantısı var. Dizin dosyası bir .MYI (MYIndex) uzantısına sahiptir.
 — dev.mysql
  • Tüm veri değerleri düşük baytla önce saklanır. Bu, veri makinesi ve işletim sistemini bağımsız yapar. İkili taşınabilirlik için tek koşul, makinenin, iki tam sayılı, imzalı tam sayılar ve IEEE kayan nokta biçimi kullanmasıdır. Bu gereksinimler ana makineler arasında yaygın olarak kullanılmaktadır. İkili uyumluluk, bazen kendine has işlemcileri olan gömülü sistemlere uygulanmayabilir.
  • Büyük dosyalar destekleyen dosya sistemleri ve işletim sistemlerinde büyük dosyalar (63 bit uzunluğa kadar) desteklenir.
  • Bir MyISAM tablosunda 232^2 (4.284.867.296) satır bulunabilir.
  • Tabloları tasarlamak ve oluşturmak daha kolay, tablolar arası ilişkilendirme (foreign key) işlemi de oldukça kolaydır.
  • InnoDB’den daha hızlı, daha basit bir yapıya sahiptir bu sayede sunucu kaynak maliyeti çok daha az olur.
  • Full-text tabanlı indeksleme vardır. Bu sayede metinsel alanlarda arama işlemi daha hızlı gerçekleşir.
  • Select işlemleri için en performanslı veri motorudur.

1.4 — InnoDB Motoru

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.
— dev.mysql
  • DML işlemleri, kullanıcı verilerini korumak için tamamlama, geri alma ve kilitlenme kurtarma özelliklerine sahip işlemlerle ACID modelini takip eder.
  • Satır düzeyinde kilitleme ve Oracle stili tutarlı okuma, çok kullanıcılı eş zamanlılık ve performansı artırır.
  • 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 bulunur.
1.4.1 InnoDB desteklenen özellikler

1.5 — BLACKHOLE Motoru

BLACKHOLE depolama motoru, verileri alan fakat depolamadan atan bir “kara delik” görevi görür. 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.


1.6 — CSV Motoru

CSV motorunun seçildiği tablolarda veriler text dosyalarında virgül ile ayrılarak tutulur.


1.7 — MEMORY Motoru

1.7 Memory motoru desteklenen özellikler
  • Oturum yönetimi veya önbellekleme gibi geçici, kritik olmayan verileri içeren işlemlerde kullanmak içindir. MySQL sunucusu durduğunda veya yeniden başlatıldığında, MEMORY tablolarındaki veriler kaybolur.
  • Hızlı erişim ve düşük gecikme süresi için bellek içi depolama yapar. Veri hacmi, işletim sisteminin sanal bellek sayfalarını takas etmeden tamamen belleğe sığabilir.
  • Salt okunur veya çoğunlukla salt okunur veri erişim modeli (sınırlı güncellemeler)
  • Satır düzeyinde kilitleme ve istemciler arasında düşük çekişme için birden çok iş parçacığı işlemi.

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.


1.8 — ARCHIVE Motoru

1.8 Archive motoru özellikleri
ARŞİV depolama altyapısı, çok miktarda indekslenmemiş veriyi çok küçük bir alana depolayan özel amaçlı tablolar üretir.
 — dev.mysql

Arşiv depolama 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.

1.9 — PERFORMANCE SCHEMA Motoru

Performans şeması sunucu olaylarını izler. Bir sorgu gerçekleştirdiğimizde bu sorgunun ne kadar sürede gerçekleştiği bilgilerini tutar. Fakat bu motor diğerlerinden farklı çalışır. Yapısal olarak bir veri tabanı oluşturmayız. Bir veritabanı olarak gelir ve içerisinde performans bilgileri barındıran tablolar içerir.