InnoDB ve MyISAM arasındaki ana farklar nelerdir?
InnoDB ve MyISAM arasındaki ana farklar nelerdir?
Yanıtlar:
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, FULLTEXT
MyISAM'de olduğu gibi v5.6'ya kadar arama dizinleri yoktur. 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.
Özetlemek gerekirse ( TL; DR ):
FULLTEXT
arama endeksleri var, InnoDB MySQL 5.6 (Şubat 2013) tarihine kadar yapmadı.version 5.6.4
InnoDB itibariyle FULLTEXT
aramayı destekliyor . dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Henüz belirtilmeyen bir diğer önemli fark, her depolama motoruna yönelik önbelleğe alma işleminin nasıl yapıldığıdır.
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, geçerli veri setinizi (MyGLK Anahtar Önbelleği için Önerilen Ayar ( key_buffer_size ) için Geçerli Ayarı verecektir ( sorgu 4G'de (4096M) öneriyi sınırlar. 32-bit işletim sistemi için 4GB sınırdır. 64-bit, 8GB'tır.
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, mevcut veri setinizi verilen InnoDB Tampon Havuzunun ( innodb_buffer_pool_size ) boyutu için Önerilen Ayarı verecektir .
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. Basitlik uğruna, sadece iki günlük dosyası verilen, onları nasıl boyutlandırabilirsiniz:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 ve ib_logfile1 yeniden oluşturulur)Her iki sorgunun da sonunda bir Satır iç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ı verirSağ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.
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:
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 COUNT(*)
s (zaman WHERE
, GROUP BY
ya da JOIN
kullanılmaz) satır sayısı içten depolanmadığı için MyISAM içinde daha yavaş yürütün. 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:
COUNT(*)
s (zaman WHERE
, GROUP BY
veya JOIN
kullanılmaz)MyISAM'de masa düzeyinde kilitleme var, ancak satır düzeyinde kilitleme yok. İşlem yok Otomatik 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 masalarının boyutları daha da azaltılabilirdi. 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.
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). Veritabanının verinin asıl "ana kopyası" olması durumunda , kullanıcılardan gerçek veriler kullanıyorsanız INSERT
ve UPDATE
kullanıyorsanız, InnoDB dışında bir şey kullanmak aptalcadır, herhangi bir ölçekte MyISAM güvenilmez ve yönetimi zordur. 'yapıyor olacak myisamchk
herhangi bir performans kazancı negating yarım saat ...
(Kişisel deneyimim: MyISAM'de 2 terabaytlık bir DB).
Oyuna biraz geç kaldım ... ama işte size oldukça geniş bir yazı yazdım . 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.
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 (örneğin Ürün Kimliği) sahip olması (örn. Ürünler) anlamına gelir, sivri tabanda güncelleme veya silme 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 bu yabancı anahtara sahip olmalıdır.
InnoDB ilişkisel bir DBMS'dir (RDBMS) ve bu nedenle referans bütünlüğü vardır, MyISAM ise değildir.
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 durdurulur 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 gerçekleştirilmez.
Bir sorgu bir MyISAM masasına 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 okuma ve yazma işlemleri varsa, bu çok büyük bir sorgu birikimi 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, sorguların aynı satırı kullanmaması koşuluyla 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 iplikleri için bir sınır belirlemelisiniz. .
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 - listesindeki bir noktayı belirler. ROLLBACK işleminin geri alınabileceği işlemler
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şlemlerden ö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.
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 indekslemesi 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ç olarak, InnoDB seçtiğiniz varsayılan depolama motorunuz olmalıdır. Belirli bir ihtiyaç duyduklarında MyISAM veya diğer veri türlerini seçin.
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:
FULLTEXT
ve SPATIAL
. InnoDB hem okuma hem de yazma ağır yükler için iyidir .
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
MyISAM
MYISAM, masa seviyesinde kilitleme, FULLTEXT araması sağlar. MYISAM, tüm depolama motorlarını işleyen en esnek AUTO_INCREMENTED sütununa sahiptir. MYISAM işlemleri desteklemiyor.
InnoDB
INNODB işlem güvenli bir depolama motorudur. INNODB taahhüt, geri alma ve kilitlenme kurtarma özelliklerine sahiptir. INNODB yabancı anahtar referans bütünlüğünü destekler.
MySQL 5.6 değişikliklerini içeriyor
INNODB DEPOLAMA MOTORU:
Bu nedenle, MyISAM
zaten 5.6'ya yükseltilmişseniz, Engine'i kullanmanın hiçbir anlamı yoktur , eğer o zaman MySQL 5.6'ya yükseltmeyi beklemeyin.
MyISAM, MySQL için bir depolama motorudur. MySQL 5.5'ten önce MySQL için varsayılan depolama motoruydu. Eski ISAM depolama motoruna dayanı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. Ancak, silme ve güncelleme işlemleri daha problemlidir: 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çinOPTIMIZE TABLE
komut ç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 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. FULLTEXT
OpenGIS standardını takip eden hem SQL hem de XA işlemlerini, tablo alanlarını, dizinleri ve mekansal işlemleri uygular . Bazı OEM sürümleri olması dışında 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.
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.