InnoDB ve MyISAM arasındaki ana farklar nelerdir?
InnoDB ve MyISAM arasındaki ana farklar nelerdir?
Gördüğüm ilk büyük fark, InnoDB'nin satır düzeyinde kilit uygulamasına karşın, MyISAM yalnızca masa düzeyinde bir kilit yapabiliyor.InnoDB'de daha iyi kaza kurtarma bulacaksınız.Ancak, sahip değil
FULLTEXTMyISAM'de olduğu gibi v5.6'ya kadar indeksleri ara.InnoDB aynı zamanda işlemleri, yabancı anahtarları ve ilişki kısıtlamalarını da uygularken, MyISAM bunu yapmaz.
Liste biraz daha ileri gidebilir.Yine de, her ikisi de kendi lehlerine benzersiz avantajları ve birbirlerine karşı dezavantajları vardır.Her biri bazı senaryolarda diğerinden daha uygundur.
Yani özetlemek için (TL; DR):
- InnoDB'de satır düzeyinde kilitleme var, MyISAM yalnızca tam masa düzeyinde kilitleme yapabilir.
- InnoDB daha iyi kaza kurtarma özelliğine sahiptir.
- MyISAM var
FULLTEXTArama dizinleri, InnoDB MySQL 5.6 (Şubat 2013) 'e kadar sürmedi.
- InnoDB işlemleri, yabancı anahtarları ve ilişki kısıtlamalarını uygular, MyISAM yapmaz.
Tecrübelerime göre, en önemli fark, her motorun kilitleme yöntemini kullanma şeklidir.InnoDB satır kilitlemeyi kullanırken, MyISAM tablo kilitlemeyi kullanır.Genel bir kural olarak, ağır tablolar yazmak için InnoDB'yi ve ağır tablolar okumak için MyISAM'i kullanıyorum.
Diğer önemli farklılıklar şunlardır:
- InnoDB destek işlemleri ve yabancı anahtarlar.MyISAM yapmaz.
- MyISAM, tam metin indekslemesini kullanır.
- MyISAM veri bütünlüğünü zorlamak için kötü bir iş yapıyor.
MyISAM'ı MySQL için 'varsayılan' tablo seçeneği olarak görme eğilimindeyim, bu yüzden InnoDB kullanıcılarının çoğu için farklılıkları işaret edeceğim
- Satır seviye kilitleme
- Yabancı anahtar yaptırımı
- İşlem desteği
- Yüksek kullanımlı sistemlerde performans düşmesi
Bir şey daha: InnoDB tablolarını sadece dosya sisteminin anlık görüntüsünü alarak yedekleyebilirsiniz.Yedekleme MyISAM, mysqldump kullanımını gerektirir ve tutarlı olması garanti edilmez (örn. Bir ebeveyn ve çocuk masasına yerleştirirseniz, yedeklemenizde yalnızca çocuk masasının sırasını bulabilirsiniz).
Temel olarak, verilerin başka bir kopyasına sahipseniz ve yalnızca MySQL'de önbelleğe alıyorsanız, örneğin bir PHP web sitesinden standart bir erişim yoluna izin vermek için, o zaman MyISAM iyidir (yani, sorgulama için düz bir CSV dosyasından veya bir günlük dosyasından daha iyidir. eşzamanlı erişim).Veri tabanı, verilerin gerçek "ana kopyası" ise,
INSERTve
UPDATEKullanıcılardan gelen gerçek verileri kullanarak, InnoDB'den başka bir şey kullanmak aptalcadır, herhangi bir ölçekte MyISAM güvenilmezdir ve yönetimi zordur;
myisamchkzamanın yarısı, performans kazanımlarını göz ardı ederek ...
(Kişisel deneyimim: MyISAM'de 2 terabaytlık bir DB).
Henüz belirtilmeyen bir diğer önemli fark, her depolama motoruna yönelik önbelleğe alma işleminin nasıl yapıldığıdır.
MyISAM
Kullanılan ana mekanizma, anahtar önbellektir.Yalnızca .MYI dosyalarındaki dizin sayfalarını önbelleğe alır.Anahtar önbelleğinizi boyutlandırmak için aşağıdaki sorguyu çalıştırın:
SELECT CONCAT(ROUND(KBS/POWER(1024, IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999), SUBSTR(' KMG',IF(PowerOf1024<0,0, IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_key_buffer_size FROM (SELECT LEAST(POWER(2,32),KBS1) KBS FROM (SELECT SUM(index_length) KBS1 FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) AA ) A, (SELECT 2 PowerOf1024) B;
Bu, MyISAM Anahtar Önbelleği için Önerilen Ayarı verir (key_buffer_size) mevcut veri kümenizi verilen (the query will cap the recommendation at 4G (4096M).32 bit işletim sistemi için 4 GB sınırdır.64 bit için 8 GB.
InnoDB'nin
Kullanılan ana mekanizma InnoDB Buffer Pool'dur.Erişilen InnoDB tablolarındaki verileri ve dizin sayfalarını önbelleğe alır.InnoDB Tampon Havuzunuzu boyutlandırmak için aşağıdaki sorguyu çalıştırın:
SELECT CONCAT(ROUND(KBS/POWER(1024, IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999), SUBSTR(' KMG',IF(PowerOf1024<0,0, IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables WHERE engine='InnoDB') A, (SELECT 2 PowerOf1024) B;
Bu InnoDB Tampon Havuzunun büyüklüğü için Tavsiye Edilen Ayarı verecektir (innodb_buffer_pool_size) mevcut veri setinizi verilen.
InnoDB Günlük Dosyalarını (ib_logfile0 ve ib_logfile1) yeniden boyutlandırmayı unutmayın.MySQL Kaynak Kodu, tüm InnoDB Günlük Dosyalarının birleştirilmiş boyutlarının bir kapağını <4G (4096M) olmalıdır. Yalnızca iki günlük dosyası verilen basitlik uğruna, bunları nasıl boyutlandırabilirsiniz:
- Adım 1) innodb_log_file_size = NNN /etc/my.cnf(NNN değerinin% 25'inin innodb_buffer_pool_size veya 2047M olması gerekir, hangisi daha küçükse)
- Adım 2)
service mysql stop
- Aşama 3)
rm /var/log/mysql/ib_logfile[01]
- 4. Adım)
service mysql start(ib_logfile0 ve ib_logfile1 yeniden oluşturulur)
UYARI
Her iki sorgunun da sonunda bir Satır İçi Sorgu
(SELECT 2 PowerOf1024)B
(SELECT 0 PowerOf1024)Bayt cinsinden ayarı verir
(SELECT 1 PowerOf1024)Kilobayt olarak ayarı verir
(SELECT 2 PowerOf1024)Megabaytlarda Ayarı verir
(SELECT 3 PowerOf1024)Gigabaytlardaki Ayarı verir
- 0'dan küçük veya 3'ten büyük olan hiçbir güç kabul edilmez
SONSÖZ
Sağduyu için hiçbir alternatif yoktur.Sınırlı belleğiniz, depolama motorlarının bir karışımını veya bunların bir kombinasyonunu varsa, farklı senaryolar için ayarlama yapmanız gerekir.
- 2GB RAM ve 16GB InnoDB'niz varsa, 512M'yi innodb_buffer_pool olarak tahsis edin.
- 2GB RAM ve 4GB MyISAM Dizininiz varsa, 512M'yi key_buffer_size olarak tahsis edin.
- 2GB RAM ve 4GB MyISAM Indexes ve 16GB InnoDB'niz varsa, 512M'yi key_buffer_size ve 512M'yi innodb_buffer_pool_size olarak tahsis edin.
Olası senaryolar sonsuzdur !!!
Unutmayın, ne için ayırdığınız, DB Bağlantıları ve İşletim Sistemi için yeterli RAM bırakın.
InnoDB şunları sunmaktadır:
- ACID işlemleri
- sıra düzeyinde kilitleme
- yabancı anahtar kısıtlamaları
- otomatik kilitlenme kurtarma
- masa sıkıştırma (okuma/yazma)
- mekansal veri türleri (mekansal indeks yok)
InnoDB’de TEXT ve BLOB hariç tüm veriler arka arkaya en fazla 8.000 bayt alabilir.Tam metin indeksleme, MySQL 5.6 (Şubat 2013) tarihine kadar InnoDB'de mevcut değildir.InnoDB içinde
COUNT(*)s (ne zaman
WHERE,
GROUP BYveya
JOINkullanılmaz) satır sayısı dahili olarak saklanmadığından MyISAM'den daha yavaş yürütülür.InnoDB hem veri hem de indeksleri bir dosyada saklar.InnoDB, verileri ve dizinleri önbelleğe almak için bir arabellek havuzu kullanır.
MyISAM şunları sunar:
- hızlı
COUNT(*)s (ne zaman
WHERE,
GROUP BYveya
JOINKullanılmıyor)
- tam metin indeksleme (güncelleme: MySQL 5.6'dan InnoDB'de desteklenir)
- daha küçük disk alanı
- Çok yüksek masa sıkıştırma (sadece okunur)
- mekansal veri türleri ve dizinler (R-tree) (güncelleme: MySQL 5.7'den InnoDB'de desteklenir)
MyISAM'de masa düzeyinde kilitleme var, ancak satır düzeyinde kilitleme yok.İşlem yokOtomatik kilitlenme kurtarması yok, ancak onarım masası işlevi sunuyor.Yabancı anahtar kısıtlamaları yoktur.MyISAM masaları genel olarak InnoDB masalarına kıyasla diskte daha küçük boyuttadır.Gerekirse, myisampack ile sıkıştırarak, ancak salt okunur hale geldiğinde, MyISAM tablolarının boyutları daha da azaltılabilir.MyISAM, dizinleri bir dosyada ve verileri başka bir dosyada depolar.MyISAM, dizinleri önbelleğe almak için anahtar arabellekleri kullanır ve veri önbellek yönetimini işletim sistemine bırakır.
Genel olarak InnoDB'yi çoğu amaç için ve MyISAM'ı yalnızca özel kullanımlar için öneriyorum.InnoDB şimdi yeni MySQL sürümlerinde varsayılan motordur.
MyISAM
MYISAM, masa seviyesinde kilitleme sağlar, FULLTEXT arama yapar.MYISAM, tüm depolama motorlarını en esnek AUTO_INCREMENTED sütununa sahiptir. MISIS işlemlerini desteklemez.
InnoDB
INNODB işlem güvenli bir depolama motorudur. NODB, taahhüt, geri alma ve kilitlenme kurtarma özelliklerine sahiptir. NODB, yabancı anahtar başvuru bütünlüğünü destekler.
MySQL 5.6 değişikliklerini içeriyor
INNODB DEPOLAMA MOTORU:
- Tam ACID (atomik, tutarlılık, izolasyon, dayanıklılık) uyumluluğu sağlar.Çoklu sürüm oluşturma, işlemleri diğerlerinden ayırmak için kullanılır.
- InnoDB, MySQL sunucusunun veya sunucunun üzerinde çalıştığı ana bilgisayarın çökmesinden sonra otomatik kurtarma sağlar.
- InnoDB, basamaklı silmeler ve güncellemeler dahil yabancı anahtarları ve başvuru bütünlüğünü destekler.
- MySQL 5.6, varsayılan depolama motoru olarak tümüyle entegre olan InnoDB platformuna dayanıyor
- Kalıcı Optimize Edici İstatistikleri: InnoDB endeks istatistiklerinin doğruluğunu ve MySQL yeniden başlatmalarında tutarlılığı sağlar.
- InnoDB masa önbelleğini budama:Çok sayıda tablo bulunan sistemlerde bellek yükünü kolaylaştırmak için InnoDB şimdi açılan bir tabloyla ilişkili belleği boşaltır.Bir LRU algoritması, erişilmeden en uzun süren tabloları seçer.
- Tam metin aramayı destekler:Özel bir dizin olan FULLTEXT dizini, InnoDB'nin metin tabanlı sütunları ve içerdikleri kelimeleri içeren sorguları ve DML işlemlerini gerçekleştirmesine yardımcı olur.Bu endeksler fiziksel olarak InnoDB tablolarının tamamı olarak temsil edilir.
- InnoDB, Tam Metin Arama'da MyISAM'dan çok daha hızlı görünüyor
Yani, kullanmanın hiçbir anlamı yok
MyISAMMotor zaten 5.6’ya yükseltildiyse, o zaman MySQL 5.6’ya yükseltmeyi beklemeyin.
Oyuna biraz geç kaldık ... ama işte MYISAM ile InnoDB arasındaki büyük farkları ayrıntılarıyla anlatan, oldukça kapsamlı bir post I wrote a few months back .Bir cuppa (ve belki bisküvi) kapın ve tadını çıkarın.
MyISAM ve InnoDB arasındaki en büyük fark, referans bütünlüğü ve işlemlerdir.Kilitleme, geri alma ve tam metin aramaları gibi başka farklar da vardır.
Bilgi tutarlılığı
Referans bütünlüğü, tablolar arasındaki ilişkilerin tutarlı kalmasını sağlar.Daha spesifik olarak, bu, bir tablonun (örn. Listeler) farklı bir tabloya işaret eden yabancı bir anahtara (örn. Ürün Kimliği) sahip olması, örneğin sivri masaya güncellemeler veya silmeler meydana geldiğinde, bu değişiklikler bağlantıya basamaklanır; 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şi gösteren tüm listeler de silinir.Ayrıca, herhangi bir yeni liste, geçerli bir girişe işaret eden yabancı anahtarlara sahip olmalıdır.
InnoDB ilişkisel bir DBMS'dir (RDBMS) ve bu nedenle referans bütünlüğü vardır, MyISAM ise değildir.
İşlemler ve Atomisite
Tablodaki veriler, SELECT, INSERT, UPDATE ve DELETE gibi Data Manipulation Language (DML) ifadeleri kullanılarak yönetilir.Bir işlem grubu iki ya da daha fazla DML ifadesini tek bir iş biriminde bir araya getirir, böylece ya tüm birim uygulanır ya da hiçbiri olmaz.
MyISAM, InnoDB'nin yaptığı işlemleri desteklemiyor.
Bir MyISAM tablosu kullanırken bir işlem kesilirse, işlem derhal iptal edilir ve işlem tamamlanmasa bile etkilenen satırlar (veya her satırdaki veriler) etkilenmeye devam eder.
Bir InnoDB tablosu kullanırken bir işlem kesilirse, atomlu olan işlemleri kullandığından, tamamlanmayan hiçbir işlem gerçekleştirilmediğinden, işlem yapılmaz.
Tablo kilitleme vs Satır kilitleme
Bir sorgu bir MyISAM tablosuna karşı çalıştığında, sorguladığı tüm tablo kilitlenir.Bu, sonraki sorguların yalnızca geçerli soru bittikten sonra gerçekleştirileceği anlamına gelir.Büyük bir masa okuyorsanız ve/veya sık sık okuma ve yazma işlemleri varsa, bu büyük bir sorgu biriktirme anlamına gelebilir.
Bir InnoDB tablosuna karşı bir sorgu çalıştığında, yalnızca ilgili satırlar kilitlenir, tablonun geri kalanı CRUD işlemleri için kullanılabilir durumda kalır.Bu, aynı satırı kullanmaması koşuluyla sorguların aynı masada 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ük olursa olsun, çekirdek tabloları arasında geçiş yapmanın bir ek yükü olması ve belirli bir tablo aralığına uygulanan önemli bir dezavantajı vardır ve sunucunun durmasını önlemek için çekirdek iş parçacıkları için bir sınır belirlemelisiniz. .
İşlemler ve Geri Alma
MyISAM'da bir işlem gerçekleştirdiğinizde, 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. KOMİTE - birden fazla DML işlemi yazabilirsiniz, ancak değişiklikler yalnızca KOMİTE yapıldığında kaydedilecektir. 2. ROLLBACK - henüz tamamlanmamış herhangi bir işlemi atabilirsiniz. 3. SAVEPOINT - ROLLBACK işleminin geri alınabileceği işlemler
Güvenilirlik
MyISAM veri bütünlüğü sağlamaz - 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 günlüğü, çift yazma tamponu ve otomatik kontrol ve doğrulama kullanır.InnoDB herhangi bir değişiklik yapmadan önce, işlemden önceki verileri ibdata1 adlı bir sistem tablo dosyasına kaydeder.Bir çökme olursa, InnoDB bu kayıtların tekrarı aracılığıyla otomatik olarak çalışacaktır.
FULLTEXT İndeksleme
InnoDB, MySQL 5.6.4 sürümüne kadar FULLTEXT endekslemeyi desteklemiyor.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, yani FULLTEXT endekslemesi InnoDB tabloları için desteklenmez.
Ancak, bu MyISAM 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 indeksleme kullanan bir MyISAM tablosu, InnoDB tablosuna dönüştürülemez.
Sonuç
Sonuç olarak, InnoDB seçtiğiniz varsayılan depolama motorunuz olmalıdır.Belirli bir ihtiyaca cevap verdiklerinde MyISAM veya diğer veri türlerini seçin.
MyISAM
MyISAM, MySQL için bir depolama motorudur.MySQL 5.5'ten önce MySQL için varsayılan depolama motoruydu.Eski ISAM depolama motoruna dayanmaktadır. MyISAM, yoğun okuma işlemleri olan ve az sayıda yazma olan veya hiç olmayan ortamlar için optimize edilmiştir.MyISAM'ın hızlı okumaya izin vermesinin nedeni, indekslerinin yapısıdır: her giriş, veri dosyasındaki bir kaydı gösterir ve işaretçi dosyanın başlangıcından ofsetlenir.Bu yolla özellikle format SABİT olarak kaydedildiğinde, kayıtlar hızlı bir şekilde okunabilir.Böylece, sıralar sabit uzunluktadır.Birinin MyISAM'ı tercih edebileceği tipik bir alan veri ambarıdır, çünkü çok büyük tablolarda sorgulamalar içerir ve bu tür tabloların güncellenmesi veritabanı kullanılmadığında (genellikle gece) yapılır.Ekler de kolaydır, çünkü veri dosyasının sonuna yeni satırlar eklenir.Bununla birlikte, silme ve güncelleme işlemleri daha sorunludur: silme işlemlerinde boşluk kalması gerekir; aksi takdirde satır ofsetleri değişir;Aynısı, satırların uzunluğu kısaldıkça güncellemeler için de geçerlidir;güncelleme, satırı daha uzun yaparsa, satır parçalanır.Satırları birleştirmek ve boş alan talep etmek için
OPTIMIZE TABLEkomut çalıştırılmalıdır.Bu basit mekanizma nedeniyle, genellikle MyISAM endeksi istatistikleri oldukça doğrudur.MyISAM'ın diğer büyük dezavantajları, işlem desteğinin ve yabancı anahtarların olmamasıdır.
InnoDB'nin
InnoDB MySQL için bir depolama motorudur.MySQL 5.5 ve sonraki sürümleri varsayılan olarak kullanır.Standart ACID uyumlu işlem özelliklerini ve yabancı anahtar desteğini (Bildirimsel Bütünlük Bütünlüğü) sağlar.SQL ve XA işlemlerini, tablo alanlarını uygular,
FULLTEXTOpenGIS standardını izleyen endeksler ve mekansal işlemler. Bazı OEM versiyonları hariç olmak üzere MySQL AB tarafından dağıtılan çoğu ikili dosyada standart olarak bulunur.Yazılım, Oracle Corporation tarafından çift lisanslıdır;GNU Genel Kamu Lisansı altında dağıtılmaktadır, ancak InnoDB'yi tescilli yazılımda birleştirmek isteyen taraflara da lisans verilebilmektedir.
çatallar
MariaDB, "MyISAM'a çarpmaya karşı güvenli bir alternatif" olarak tanımlanan Aria adlı bir depolama motoruna sahip.MariaDB ve Percona Server, varsayılan olarak XtraDB adlı bir InnoDB çatalı kullanır.XtraDB, Percona tarafından sağlanır.Oracle InnoDB'nin değişiklikleri düzenli olarak XtraDB'ye aktarılır ve bazı hata düzeltmeleri ve ekstra özellikler eklenir.