MySQL'de InnoDB ve MyISAM nedir?


122

Nedir InnoDBve MyISAMiçinde MySQL?



Bu veritabanı motoru ... kavoir.com/2009/09/…
Matthieu

Veritabanımız için her iki depolama motorunu aynı anda kullanabilir miyiz?
user130561

1
Bunları aynı anda farklı masalarda yapabilirsiniz, ancak verilen bir tablo için hangisini kullanmak istediğinizi seçmeniz gerekir ...
Matthieu

Yanıtlar:


111

InnoDBve MYISAMdepolama motorlarıdır MySQL.

Bu ikisi kilitleme uygulamasında farklılık gösterir: InnoDBtablodaki belirli satırı MyISAMkilitler ve tüm MySQLtabloyu kilitler .

DB'de tablo oluştururken MYISAMOR vererek tipi belirtebilirsiniz InnoDB.


Açık ve basit cevap.
vadiraj jahagirdar

38

Bir bak bakalım

InnoDB ve MyISAM

InnoDB, MySQL AB tarafından dağıtılan mevcut tüm ikili dosyalara standart olarak dahil edilen bir MySQL depolama motorudur. MySQL ile kullanılabilen diğer depolama motorlarına göre ana geliştirmesi, ACID uyumlu işlem desteğidir

MyISAM, 5.5 1'den önceki MySQL ilişkisel veritabanı yönetim sistemi sürümleri için varsayılan depolama motorudur . Eski ISAM kodunu temel alır ancak birçok kullanışlı uzantıya sahiptir. MyISAM'ın en büyük eksikliği, işlem desteğinin olmamasıdır. MySQL 5.5 ve daha sonraki sürümleri, bilgi tutarlılığı kısıtlamaları ve daha yüksek eşzamanlılık sağlamak için InnoDB motoruna geçmiştir.


1
Veritabanımız için her iki depolama motorunu aynı anda kullanabilir miyiz?
user130561

2
yapabilirsiniz, çünkü her tablo için farklı bir depolama motoru tanımlayabilirsiniz. başka bir soru, yapmanız gerekip gerekmediğidir. mysql belgelerinde bu konuyla ilgili bazı açıklamalar bulunmaktadır.
nano7

18

Depolama motorlarıdır.

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM: Varsayılan MySQL depolama motoru ve Web'de, veri ambarında ve diğer uygulama ortamlarında en çok kullanılan motor. MyISAM, tüm MySQL yapılandırmalarında desteklenir ve MySQL'i varsayılan olarak farklı bir tane kullanacak şekilde yapılandırmadıysanız, varsayılan depolama motorudur.

InnoDB: Kullanıcı verilerini korumak için kesinleştirme, geri alma ve çökme kurtarma özelliklerine sahip MySQL için işlem güvenli (ACID uyumlu) bir depolama motoru. InnoDB satır düzeyinde kilitleme (daha kaba taneciklik kilitlerine yükseltmeden) ve Oracle tarzı tutarlı kilitsiz okumalar, çok kullanıcılı eşzamanlılığı ve performansı artırır. InnoDB, birincil anahtarlara dayalı yaygın sorgular için G / Ç'yi azaltmak için kullanıcı verilerini kümelenmiş dizinlerde depolar. Veri bütünlüğünü korumak için InnoDB ayrıca FOREIGN KEY referans bütünlüğü kısıtlamalarını da destekler.


Öyleyse, MySQL'i kurarken, MySQL veritabanı olarak hangi depolama motorunun kullanılacağını özellikle belirlememiz gerekiyor mu?
user130561

3
Yazımda belirtildiği gibi, varsayılan MyISAM'dir. INNODB gibi farklı bir depolama motorunun özelliklerini kullanmak istiyorsanız, evet belirtmeniz gerekir. Bu, yükleme sırasında yapılmaz, bunun yerine ilk tablo oluşturma sırasında yapılır.
mluebke

3
Ancak buna göre: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; Varsayılan motor InnoDB'dir.
Harsha

2
Dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html'ye göre : "Varsayılan motor MySQL 5.5.5'ten itibaren InnoDB'dir (5.5.5'ten önceki MyISAM)" Yani varsayılan motor artık InnoDB'nin. Bu cevap, varsayılan motor olarak InnoDB ile ilk genel kullanılabilirlik sürümünden 16 gün sonra yayınlandı;)
SOFe

6

Tablo başına belirli bir depolama motoru belirleyebilmenin MySQL'in temel güçlü yönlerinden biri olduğunu eklemek istedim (kullanım kolaylığı ve ince ayar gerektirmeyen iyi performansın yanı sıra). İşlemlerin gerekli olduğu tüm işlemler için InnoDB'ye bağlı kalmanız yeterlidir. Ancak MyISAM, belirli durumlarda işlemlere ihtiyaç duyulmadığında işleri gerçekten hızlandırabilir ve InnoDB'ye kıyasla daha az disk alanı ve RAM gerektirir.

Bununla birlikte, InnoDB her zaman daha iyi hale geliyor:

InnoDB 1.1 Performans ve Ölçeklenebilirlik Geliştirmeleri


4

MyISAM, verilerin bütünlüğünü korumak için işlemleri izleyen InnoDB'nin aksine ACID'yi takip etmez.

MyISAM eşzamanlı eklemeleri destekler: Bir tablonun veri dosyasının ortasında boş bloklar yoksa, diğer iş parçacıkları tablodan okurken aynı anda yeni satırlar INSERT edebilirsiniz. MySqlDoc

Bu nedenle MyISAM daha hızlıdır ve daha az yer kaplar. Örneğin, MySQL MyISAM Storage Engine, aktarımları desteklemez. MySQL MYISAM'ın kısıtlamaları Concurrent-insert adında bir bit vardır Varsayılan olarak, değişken 1'e ayarlanır ve eşzamanlı eklemeler az önce açıklandığı gibi kullanılır. 0 olarak ayarlanırsa, eşzamanlı eklemeler devre dışı bırakılır. 2 olarak ayarlanırsa, satırları silmiş tablolar için bile tablonun sonundaki eşzamanlı eklemelere izin verilir. Tablonun ortasında delik / silinmiş satır yoksa (eşzamanlı ekleme sırasında), tablonun sonuna aynı anda satır eklemek için bir INSERT deyimi çalıştırılabilir.

Mysql InnoDB'nin varsayılan izolasyon seviyesi "Tekrarlanabilir Okuma" dır. MyISAM için işlem yoktur. InnoDB satır düzeyinde kilitlemeyi kullanırken MyISAM yalnızca tablo düzeyinde kilitlemeyi kullanabilir, bu nedenle InnoDB'nin çökme revovery'si MyISAM'den daha iyidir. Bir zorundadır elle tablo seviyesi kilidi elde bir eşzamanlılık etkilerinden kaçınmak istiyorsa MyISAM içinde.


3

InnoDB , MySQL'in işlemsel bir depolama motorudur, MyISAM ise işlemsel olmayan bir depolama motorudur. Başka bir deyişle InnoDB, verilerin bütünlüğünü korumak için ACID özelliklerini takip eder, ancak MyISAM ACID özelliklerini izlemez, dolayısıyla verilerin bütünlüğünü koruyamaz.

Bir InnoDB (işlem) tablosunda, işlem değişiklikleri, geri alma gerekliyse kolayca geri alınabilir. Ancak bir MyISAM (işlemsel olmayan) tablosunda yapılan değişiklikler, bir işlemi geri almak gerektiğinde geri alınamaz.

Örneğin, çek hesabınızdan tasarruf hesabına para transfer etmek istiyorsunuz. Bu, 5 sorgu içeren bir işlemle yapılır.

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

Diyelim ki, işlem 4. adımda çöküyor. Burada bir InnoDB tablosu kullanılmışsa, geri alma değişiklikleri geri alır ve para kaybetme riskinden kurtulmuş olursunuz. Kelimenin tam anlamıyla, tablo herhangi bir çökmenin farkında değildir, çünkü 5. adım başarıyla yürütülmedikçe değişiklikler tabloya yüklenmeyecektir.

Ancak MyISAM tablosu söz konusu olduğunda, bir geri alma çağrıldığında veya işlemin başarısızlığına yol açan bir kilitlenme olduğunda işlem değişiklikleri geri alınamaz. Bu, işlemin 3. adımda çökmesi durumunda, çek hesabınızdan para çekileceği anlamına gelir. Ancak tasarruf hesabınıza para eklenmezdi.

Örnek nezaket: "High Performance MySQL: Optimization, Backups, and Replication" - Book by Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev ve Vadim Tkachenko


1

MySQL sunucunuz çöktüğünde, veriler bir dizi MyISAM tablosundan o büyük InnoDB işlem dosyasından çok daha kolay kurtarılabilir. Her MyISAM tablosunun ayrı bir dosyası vardır ve çökme sırasında bu tabloya herhangi bir yazma işlemi yapılmadıysa, tamamen etkilenmeyecektir. InnoDB durumunda, tüm MySQL sunucusunun tüm işlem dosyası yeniden indekslenmelidir veya bir çökmeden sonra ne yaparsa yapsın. Bu oldukça dağınık olabilir.


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.