InnoDB ve MyISAM arasındaki fark nedir?


17

Mevcut web projem için veritabanım olarak MySQL kullanıyorum. MySQL'de yeniyim. Lütfen bana InnoDB ve MyISAM arasındaki farkı açıklayın.


ayrıca bir MySQL etiket eklemek için çekinmeyin :)
Johan

Bu yığın akışına ait değil mi?
ripper234

@ ripper234. Bu yayının iki daha iyi sürümü (çok daha fazla arka plan; önceki araştırmaların daha fazla gösterimi) SO'da mevcut: stackoverflow.com/q/12614541/209139 ve stackoverflow.com/q/20148/209139 .
TRiG

Yanıtlar:


14

ISAM = Endeksli Sıralı Erişim Yöntemi ve aslında düz bir dosyadır (hatırlayabilen, Btrieve veya B-Tree düşünebilen DBA'lar için). Bu çok eski bir teknoloji - ama bunu size bırakmanıza izin vermeyin. Düz bir dosya olduğundan (daha sonra daha fazla), ilişkisel değildir ve bu nedenle bir RDBMS değildir ve bu nedenle bazı durumlarda daha uygundur.

InnoDB, büyük olasılıkla aşina olduğunuz gibi tam RDBMS'dir. MyISAM, bağlantılarınızı, mantığınızı ve referans bütünlüğünüzü koruyan başka bir katman eklenmiş olarak ilişkisel görünebilir.

Çok fazla kayıtınız varsa (20 milyon gibi) ISAM mükemmeldir ve kayıtlar çoğunlukla tek başınadır (yani ilişkili verileri almak için çok fazla bağlantı yapmanız gerekmez). Dizinlere çok fazla güvenir ve doğru dizine sahip değilseniz, çok uzun sorgu sürelerine hazırlıklı olun. Durumda: 20M + kayıtları ile bir Btrieve ISAM tablo vardı ve doğru bir indeks dayalı bir alma ve filtre verileri yapmak neredeyse anında oldu. Yanlış endeksin kullanılması tam anlamıyla 15 dakikaydı.

InnoDB, çok sayıda ilişkisel bağlantınız varsa harika. Tablo A, Tablo B ve Tablo C ve D'ye atıfta bulunan bir alanı referans alır. InnoDB, bu kayıtları her türlü hoş birleştirme yöntemlerini (karma birleştirmeler, vb.) Kullanarak getirebilirken, ISAM veritabanının her biri için birden çok alt sorgu çalıştırması gerekir kayıtları manuel olarak sıralayın ve eşleştirin.

Bundan çok daha fazla ayrıntı istiyorsanız, veritabanlarında gerçekten bir ders yapmak zorunda kalacaksınız!


ISAM, diğer her şey kadar ilişkiseldir, bunun için optimize edilmemiştir.
LapTop006

teşekkürler 4 kısa açıklamanız. Şimdi temelde temizlendim

5

En temel olanı InnoDB'nin işlemsel olmasıdır. MyIsam değil. MyIsam genellikle biraz daha hızlıdır, bu nedenle genellikle en iyi bahsiniz olan işlemlere ihtiyacınız yoksa. Ayrıntılı açıklamalar için MySQL belgelerini okumalısınız.


2

Bu günlerde günlük stili verileri için bir tablo kullanmıyorsanız (SELECT'den sonra daha fazla INSERT, işlem yok) InnoDB genellikle daha hızlı, daha güvenilirdir, daha fazla özelliğe sahiptir.

MyISAM'in sahip olduğu diğer tek özellik, temel kullanım için iyi olan tam metin aramasıdır, ancak çoğu insan Lucene'den bazılarını ciddi bir şey için kullanır.

Her iki durumda da, varsayılan olarak diğer hizmetlerle paylaşılan 32 MB'lık bir pentium için varsayılan olarak ayarlandığından MySQL'i ayarlamanız gerekir .


2

Oyuna biraz geç ... ama burada birkaç ay önce yazdığım ve MYISAM ile InnoDB arasındaki büyük farkları ayrıntılandıran oldukça kapsamlı bir yazı . Bir fincan (ve belki bir bisküvi) alın ve tadını çıkarın.


MyISAM ve InnoDB arasındaki en büyük fark referans bütünlüğü ve işlemleridir. Kilitleme, geri alma ve tam metin araması gibi başka farklar da vardır.

Bilgi tutarlılığı

Referans bütünlüğü tablolar arasındaki ilişkilerin tutarlı olmasını sağlar. Daha spesifik olarak, bu, bir tablonun (örn. Listeler) farklı bir tabloyu (örn. Ürünler) gösteren bir yabancı anahtarı (örn. Ürünler) olduğunda, sivri uçtaki tabloda güncellemeler veya silmeler meydana geldiğinde, bu değişikliklerin bağlantıya basamaklandırılması anlamına gelir tablo. Örneğimizde, bir ürün yeniden adlandırılırsa, bağlantı tablosunun yabancı anahtarları da güncellenir; bir ürün 'Ürünler' tablosundan silinirse, silinen girişe işaret eden tüm girişler de silinir. Ayrıca, tüm yeni listelerin geçerli bir girişe işaret eden yabancı anahtarın olması gerekir.

InnoDB ilişkisel bir DBMS'dir (RDBMS) ve bu nedenle referans bütünlüğü vardır, ancak MyISAM bunu yapmaz.

İşlemler ve Atomiklik

Bir tablodaki veriler SELECT, INSERT, UPDATE ve DELETE gibi Veri İşleme Dili (DML) ifadeleri kullanılarak yönetilir. Bir işlem grubu iki veya daha fazla DML ifadesini tek bir iş biriminde bir araya getirir, böylece tüm birim uygulanır veya hiçbiri uygulanmaz.

MyISAM işlemleri desteklemezken InnoDB desteklemez.

Bir MyISAM tablosu kullanılırken bir işlem kesilirse, işlem derhal durdurulur ve etkilenen satırlar (hatta her satırdaki veriler) işlem tamamlanmasa bile etkilenmeye devam eder.

InnoDB tablosu kullanılırken bir işlem kesintiye uğrarsa, atomisitesi olan işlemler kullanması nedeniyle, tamamlanmayan herhangi bir işlem herhangi bir taahhüt yapılmadığından geçerli olmayacaktır.

Masa kilitleme ve Sıra kilitleme

Bir sorgu bir MyISAM tablosunda çalıştırıldığında, sorgulandığı tablonun tamamı kilitlenir. Bu, sonraki sorguların yalnızca geçerli sorgu bittikten sonra yürütüleceği anlamına gelir. Büyük bir tablo okuyorsanız ve / veya sık okuma ve yazma işlemleri varsa, bu büyük bir sorgu birikimi anlamına gelebilir.

Bir sorgu bir InnoDB tablosunda çalıştırıldığında, yalnızca ilgili satır (lar) kilitlenir, tablonun geri kalanı CRUD işlemleri için kullanılabilir durumda kalır. Bu, sorguların aynı satırı kullanmadıkları sürece aynı tabloda aynı anda çalışabileceği anlamına gelir.

InnoDB'deki bu özellik eşzamanlılık olarak bilinir. Eşzamanlılık ne kadar büyükse, belirli bir dizi tablo için geçerli olan büyük bir dezavantaj vardır, çünkü çekirdek iş parçacıkları arasında geçiş yapmada bir ek yük vardır ve sunucunun durmasını önlemek için çekirdek iş parçacıklarında bir sınır belirlemelisiniz. .

İşlemler ve Geri Alımlar

MyISAM içinde bir işlem çalıştırdığınızda, değişiklikler ayarlanır; InnoDB'de bu değişiklikler geri alınabilir. İşlemleri kontrol etmek için kullanılan en yaygın komutlar COMMIT, ROLLBACK ve SAVEPOINT'tir. 1. COMMIT - birden fazla DML işlemi yazabilirsiniz, ancak değişiklikler yalnızca bir COMMIT yapıldığında kaydedilir 2. ROLLBACK - henüz tamamlanmamış işlemleri iptal edebilirsiniz 3. SAVEPOINT - listesinde bir nokta belirler GERİ ALMA işleminin geri alınabileceği işlemler

Güvenilirlik

MyISAM hiçbir veri bütünlüğü sunmaz - Donanım hataları, temiz olmayan kapanmalar ve iptal edilen işlemler verilerin bozulmasına neden olabilir. Bu, dizinlerin ve tabloların tam olarak onarılmasını veya yeniden oluşturulmasını gerektirir.

InnoDB ise işlem bozulmalarını önlemek için işlem kaydı, çift yazma tamponu ve otomatik sağlama toplamı ve doğrulama kullanır. InnoDB herhangi bir değişiklik yapmadan önce, ibdata1 adlı bir sistem tablo alanı dosyasına işlemlerden önce verileri kaydeder. Bir kilitlenme olursa, InnoDB bu günlüklerin yeniden yürütülmesi yoluyla otomatik olarak yeniden bulur.

FULLTEXT Dizine Ekleme

InnoDB, MySQL sürüm 5.6.4'e kadar FULLTEXT dizinlemesini desteklemez. Bu yazının yazımından itibaren, birçok paylaşılan barındırma sağlayıcısının MySQL sürümü hala 5.6.4'ün altındadır, bu da InnoDB tabloları için FULLTEXT dizinlemesinin desteklenmediği anlamına gelir.

Ancak, bu MyISAM'i kullanmak için geçerli bir neden değildir. MySQL'in güncel sürümlerini destekleyen bir barındırma sağlayıcısına geçmek en iyisidir. FULLTEXT dizinlemesi kullanan bir MyISAM tablosu, InnoDB tablosuna dönüştürülemez.

Sonuç

Sonuç olarak, InnoDB varsayılan depolama motorunuz olmalıdır. Belirli bir ihtiyaca hizmet ettiklerinde MyISAM veya diğer veri türlerini seçin.


1

Genel olarak, hız kuralı, hız istiyorsanız MyISAM ve kararlılık istiyorsanız InnoDB kullanın. Doğru hatırlıyorsam atomisite ile ilgili bir şey.


3
Artık bu doğru değil, InnoDB çoğu durumda daha hızlı.
LapTop006

1
Birisi bazı kıstaslar falan link ekleyebilir mi?
Johan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.