it-swarm.dev

Jakie są główne różnice między InnoDB i MyISAM?

Jakie są główne różnice między InnoDB i MyISAM?

255
ilhan

Pierwszą dużą różnicą, którą widzę, jest to, że InnoDB implementuje blokadę na poziomie wiersza, podczas gdy MyISAM może wykonać blokadę tylko na poziomie tabeli. Lepsze odzyskiwanie po awarii znajdziesz w InnoDB. Jednak nie ma ona indeksów wyszukiwania FULLTEXT aż do wersji 5.6, podobnie jak MyISAM. InnoDB implementuje także transakcje, klucze obce i ograniczenia relacji, podczas gdy MyISAM tego nie robi.

Lista może pójść nieco dalej. Obaj mają jednak swoje wyjątkowe zalety na swoją korzyść i wady względem siebie. Każdy z nich jest bardziej odpowiedni w niektórych scenariuszach niż w innych.

Podsumowując (TL; DR):

  • InnoDB ma blokowanie na poziomie wiersza, MyISAM może wykonywać tylko pełne blokowanie na poziomie tabeli.
  • InnoDB ma lepsze odzyskiwanie po awarii.
  • MyISAM ma FULLTEXT indeksy wyszukiwania, InnoDB zrobił to dopiero MySQL 5.6 (luty 2013).
  • InnoDB implementuje transakcje, klucze obce i ograniczenia relacji, MyISAM tego nie robi.
165
poelinca

Inną zasadniczą różnicą, o której jeszcze nie wspomniano, jest sposób buforowania każdego silnika pamięci masowej.

[~ # ~] myisam [~ # ~]

Głównym stosowanym mechanizmem jest pamięć podręczna kluczy. Buforuje tylko strony indeksowe z plików .MYI. Aby zmienić rozmiar pamięci podręcznej kluczy, uruchom następujące zapytanie:

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;

To da Zalecane ustawienie pamięci podręcznej kluczy MyISAM ( key_buffer_size ) biorąc pod uwagę twój aktualny zestaw danych ( zapytanie ograniczy zalecenie przy 4G (4096M). W przypadku 32-bitowego systemu operacyjnego limit wynosi 4 GB, aw przypadku 64-bitowego 8 GB.

InnoDB

Głównym zastosowanym mechanizmem jest pula buforów InnoDB. Buforuje dane i strony indeksowe z tabel InnoDB, do których uzyskano dostęp. Aby zmienić wielkość puli buforów InnoDB, uruchom następujące zapytanie:

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;

To da ustawienie zalecane dla wielkości puli buforów InnoDB ( innodb_buffer_pool_size ), biorąc pod uwagę twój aktualny zestaw danych.

Nie zapomnij zmienić rozmiaru plików dziennika InnoDB (ib_logfile0 i ib_logfile1). Kod źródłowy MySQL umieszcza limit łącznych rozmiarów wszystkich plików dziennika InnoDB musi wynosić <4G (4096M). Dla uproszczenia, biorąc pod uwagę tylko dwa pliki dziennika, oto sposób ich rozmiaru:

  • Krok 1) Dodaj innodb_log_file_size = NNN do /etc/my.cnf (NNN powinien wynosić 25% innodb_buffer_pool_size lub 2047M, w zależności od tego, która wartość jest mniejsza)
  • Krok 2) service mysql stop
  • Krok 3) rm /var/log/mysql/ib_logfile[01]
  • Krok 4) service mysql start (ib_logfile0 i ib_logfile1 są odtwarzane)

[~ # ~] zastrzeżenie [~ # ~]

Na końcu obu zapytań znajduje się zapytanie wbudowane (SELECT 2 PowerOf1024) B

  • (SELECT 0 PowerOf1024) podaje ustawienie w bajtach
  • (SELECT 1 PowerOf1024) podaje ustawienie w kilobajtach
  • (SELECT 2 PowerOf1024) podaje ustawienie w megabajtach
  • (SELECT 3 PowerOf1024) podaje ustawienie w gigabajtach
  • Żadne moce mniejsze niż 0 lub większe niż 3 nie są akceptowane

[~ # ~] epilog [~ # ~]

Nic nie zastąpi zdrowego rozsądku. Jeśli masz ograniczoną pamięć, mieszankę silników pamięci lub ich kombinację, będziesz musiał dostosować się do różnych scenariuszy.

  • Jeśli masz 2 GB RAM i 16 GB InnoDB, przydziel 512M jako pulę innodb_buffer_pool.
  • Jeśli masz 2 GB RAM i 4 GB indeksów MyISAM), przydziel 512 MB jako key_buffer_size.
  • Jeśli masz 2 GB RAM i 4 GB indeksów MyISAM i 16 GB InnoDB, przydziel 512 MB jako rozmiar_ bufora_klucza i 512 MB jako rozmiar_bufora_wynodb.

Możliwe scenariusze są nieograniczone !!!

Pamiętaj, bez względu na to, na co przeznaczasz, pozostaw wystarczającą wartość RAM dla połączeń DB i systemu operacyjnego.

89
RolandoMySQLDBA

InnoDB oferuje:

  • Transakcje ACID
  • blokowanie na poziomie wiersza
  • ograniczenia klucza obcego
  • automatyczne przywracanie po awarii
  • kompresja tabeli (odczyt/zapis)
  • typy danych przestrzennych (bez indeksów przestrzennych)

W InnoDB wszystkie dane z rzędu oprócz TEKSTU i BLOBA mogą zajmować maksymalnie 8 000 bajtów. Indeksowanie pełnotekstowe nie jest dostępne w InnoDB do MySQL 5.6 (luty 2013). W InnoDB COUNT(*) s (gdy nie jest używane WHERE, GROUP BY Lub JOIN) nie działa) niż w MyISAM, ponieważ liczba wierszy nie jest przechowywana wewnętrznie . InnoDB przechowuje zarówno dane, jak i indeksy w jednym pliku. InnoDB używa puli buforów do buforowania zarówno danych, jak i indeksów.

MyISAM oferuje:

  • szybkie COUNT(*) s (gdy WHERE, GROUP BY lub JOIN nie jest używane)
  • indeksowanie pełnotekstowe (aktualizacja: obsługiwane w InnoDB z MySQL 5.6)
  • mniejszy ślad na dysku
  • bardzo wysoka kompresja tabeli (tylko do odczytu)
  • typy danych przestrzennych i indeksy (R-drzewo) (aktualizacja: obsługiwane w InnoDB z MySQL 5.7)

MyISAM ma blokowanie na poziomie tabeli, ale nie blokuje na poziomie wiersza. Brak transakcji. Brak automatycznego odzyskiwania po awarii, ale oferuje funkcje tabeli napraw. Brak ograniczeń klucza obcego. Tabele MyISAM są na ogół bardziej kompaktowe na dysku w porównaniu do tabel InnoDB. Tabele MyISAM można dodatkowo znacznie zmniejszyć, kompresując myisampack, jeśli to konieczne, ale stać się tylko do odczytu. MyISAM przechowuje indeksy w jednym pliku, a dane w innym. MyISAM używa buforów kluczy do buforowania indeksów i pozostawia zarządzanie buforowaniem danych w systemie operacyjnym.

Ogólnie polecam InnoDB do większości celów, a MyISAM tylko do specjalistycznych zastosowań. InnoDB jest teraz domyślnym silnikiem w nowych wersjach MySQL.

63
dabest1

Trochę za późno na grę ... ale tutaj jest całkiem wyczerpujący post napisałem kilka miesięcy tem , wyszczególniając główne różnice między MYISAM a InnoDB. Chwyć cuppa (a może herbatniki) i ciesz się.


Główną różnicą między MyISAM a InnoDB jest integralność referencyjna i transakcje. Istnieją również inne różnice, takie jak blokowanie, wycofywanie zmian i wyszukiwanie pełnotekstowe.

Więzy integralności

Integralność referencyjna zapewnia spójność relacji między tabelami. Mówiąc dokładniej, oznacza to, że gdy tabela (np. Listy) ma klucz obcy (np. Identyfikator produktu) wskazujący inną tabelę (np. Produkty), gdy aktualizacje lub usunięcia wystąpią w tabeli wskazanej, zmiany te są kaskadowane do łączenia stół. W naszym przykładzie, jeśli nazwa produktu zostanie zmieniona, klucze obce tabeli łączącej również się zaktualizują; jeśli produkt zostanie usunięty z tabeli „Produkty”, zostaną również usunięte wszelkie wykazy wskazujące na usunięty wpis. Ponadto każdy nowy wpis musi mieć ten klucz obcy wskazujący prawidłowy, istniejący wpis.

InnoDB jest relacyjnym DBMS (RDBMS), a zatem ma integralność referencyjną, podczas gdy MyISAM nie.

Transakcje i atomowość

Dane w tabeli są zarządzane za pomocą instrukcji DML (Data Manipulation Language), takich jak SELECT, INSERT, UPDATE i DELETE. Transakcja grupuje dwie lub więcej instrukcji DML razem w jedną jednostkę pracy, więc albo stosowana jest cała jednostka, albo żadna z niej nie jest.

MyISAM nie obsługuje transakcji, podczas gdy InnoDB obsługuje.

Jeśli operacja zostanie przerwana podczas korzystania z tabeli MyISAM, operacja zostanie natychmiast przerwana, a zmienione wiersze (lub nawet dane w każdym wierszu) pozostaną zmienione, nawet jeśli operacja nie zostanie ukończona.

Jeśli operacja zostanie przerwana podczas korzystania z tabeli InnoDB, ponieważ wykorzystuje ona transakcje o atomowości, każda transakcja, która nie została zakończona, nie wejdzie w życie, ponieważ nie zostanie wykonane zatwierdzenie.

Blokowanie tabeli a blokowanie wiersza

Gdy zapytanie działa przeciwko tabeli MyISAM, cała tabela, w której jest wysyłana, zostanie zablokowana. Oznacza to, że kolejne zapytania będą wykonywane dopiero po zakończeniu bieżącego. Jeśli czytasz dużą tabelę i/lub często występują operacje odczytu i zapisu, może to oznaczać ogromne zaległości w zapytaniach.

Gdy zapytanie działa przeciwko tabeli InnoDB, tylko zaangażowane wiersze są zablokowane, reszta tabeli pozostaje dostępna dla operacji CRUD. Oznacza to, że zapytania mogą być uruchamiane jednocześnie w tej samej tabeli, pod warunkiem, że nie używają tego samego wiersza.

Ta funkcja w InnoDB jest znana jako współbieżność. Niezależnie od tego, jak duża jest współbieżność, istnieje poważna wada, która ma zastosowanie do wybranego zakresu tabel, polegająca na tym, że przełączanie między wątkami jądra wiąże się z narzutem, i powinieneś ustawić limit wątków jądra, aby zapobiec zatrzymaniu się serwera .

Transakcje i wycofania

Po uruchomieniu operacji w MyISAM zmiany są ustawiane; w InnoDB zmiany te można wycofać. Najpopularniejsze polecenia używane do kontrolowania transakcji to COMMIT, ROLLBACK i SAVEPOINT. 1. COMMIT - możesz napisać wiele operacji DML, ale zmiany zostaną zapisane dopiero po wykonaniu COMMIT 2. ROLLBACK - możesz odrzucić wszelkie operacje, które nie zostały jeszcze zatwierdzone 3. SAVEPOINT - ustawia punkt na liście operacje, do których można przywrócić operację ROLLBACK

Niezawodność

MyISAM nie zapewnia integralności danych - awarie sprzętu, nieczyste wyłączenia i anulowane operacje mogą spowodować uszkodzenie danych. Wymagałoby to pełnej naprawy lub przebudowy indeksów i tabel.

InnoDB, z drugiej strony, wykorzystuje dziennik transakcji, bufor podwójnego zapisu oraz automatyczne sumowanie i sprawdzanie, aby zapobiec uszkodzeniu. Przed wprowadzeniem jakichkolwiek zmian InnoDB zapisuje dane przed transakcjami w pliku obszaru tabel o nazwie ibdata1. W przypadku awarii InnoDB automatycznie odzyskałby zawartość poprzez odtworzenie tych dzienników.

Indeksowanie FULLTEXT

InnoDB nie obsługuje indeksowania FULLTEXT, dopóki MySQL w wersji 5.6.4. W chwili pisania tego postu wersja MySQL wielu dostawców hostingu współdzielonego jest nadal niższa niż 5.6.4, co oznacza, że ​​indeksowanie FULLTEXT nie jest obsługiwane dla tabel InnoDB.

Nie jest to jednak uzasadniony powód do korzystania z MyISAM. Najlepiej jest zmienić się na dostawcę hostingu obsługującego aktualne wersje MySQL. Nie dlatego, że tabela MyISAM, która korzysta z indeksowania FULLTEXT, nie może zostać przekonwertowana na tabelę InnoDB.

Wniosek

Podsumowując, InnoDB powinien być twoim domyślnym silnikiem pamięci. Wybierz MyISAM lub inne typy danych, jeśli spełniają one określone potrzeby.

32
d4nyll

Jeszcze jedno: możesz wykonać kopię zapasową tabel InnoDB, wykonując migawkę systemu plików. Tworzenie kopii zapasowej MyISAM wymaga użycia mysqldump i nie ma gwarancji, że będzie spójne (np. Jeśli wstawisz tabelę nadrzędną i podrzędną, w kopii zapasowej może znajdować się tylko wiersz tabeli podrzędnej).

Zasadniczo, jeśli masz inną kopię danych i buforujesz ją tylko w MySQL, np. aby umożliwić standardowy sposób dostępu do niego z PHP, wtedy MyISAM jest w porządku (tzn. jest lepszy niż płaski plik CSV lub plik dziennika do wysyłania zapytań i równoczesnego dostępu). Jeśli baza danych jest faktyczna „główna kopia” danych, jeśli wykonujesz INSERT i UPDATE przy użyciu prawdziwych danych od użytkowników, głupotą jest używanie czegokolwiek innego niż InnoDB, w dowolnej skali MyISAM jest niewiarygodne i trudne w zarządzaniu, będziesz robił myisamchk połowę czasu, negując jakiekolwiek zyski wydajności ...

(Moje osobiste doświadczenie: 2 terabajtowa baza danych w MyISAM).

31
Gaius

Z mojego doświadczenia wynika, że ​​najbardziej znaczącą różnicą jest sposób blokowania każdego silnika. InnoDB używa blokowania wierszy, podczas gdy MyISAM korzysta z blokowania tabel. Zasadniczo używam InnoDB do pisania ciężkich tabel i MyISAM do odczytu ciężkich tabel.

Inne ważne różnice obejmują:

  1. Transakcje obsługi InnoDB i klucze obce. MyISAM nie.
  2. MyISAM wykorzystuje indeksowanie pełnotekstowe.
  3. MyISAM źle radzi sobie z egzekwowaniem integralności danych.
19
bsoist

Zwykle postrzegam MyISAM jako „domyślną” tabelę do wyboru dla MySQL, więc zwrócę uwagę na różnice dla większości użytkowników InnoDB

  • Blokowanie poziomu rzędu
  • Egzekwowanie klucza obcego
  • Obsługa transakcji
  • Uderzenie wydajności w systemach o wysokim użyciu
9
Patrick

Obejmuje zmiany w MySQL 5.6

SILNIK DO PRZECHOWYWANIA INNODB:

  • Zapewnia pełną zgodność z ACID (atomowość, konsystencja, izolacja, trwałość). Wiele wersji służy do izolowania transakcji od siebie.
  • InnoDB zapewnia automatyczne odzyskiwanie po awarii serwera MySQL lub hosta, na którym działa serwer.
  • InnoDB obsługuje klucze obce i integralność referencyjną, w tym kaskadowe usuwanie i aktualizacje.
  • MySQL 5.6 opiera się na platformie InnoDB w pełni zintegrowanej jako domyślny silnik pamięci
  • Trwałe statystyki optymalizatora: Zapewnia lepszą dokładność statystyk indeksu InnoDB i spójność między restartami MySQL.
  • Czyszczenie pamięci podręcznej tabeli InnoDB: Aby zmniejszyć obciążenie pamięci w systemach z dużą liczbą tabel, InnoDB zwalnia teraz pamięć związaną z otwartą tabelą. Algorytm LRU wybiera tabele, które przeszły najdłużej bez dostępu.
  • Obsługuje wyszukiwanie pełnotekstowe: Specjalny rodzaj indeksu, indeks FULLTEXT, pomaga InnoDB radzić sobie z zapytaniami i operacjami DML obejmującymi kolumny tekstowe i zawarte w nich słowa. Indeksy te są fizycznie reprezentowane jako całe tabele InnoDB.
  • InnoDB wydaje się być znacznie szybszy w wyszukiwaniu pełnotekstowym niż MyISAM

Więc nie ma sensu używać MyISAM Engine, jeśli jesteś już zaktualizowany do wersji 5.6, jeśli nie, nie czekaj na aktualizację do MySQL 5.6.

Wydajność InnoDB VS MyISAM przy użyciu MySQL 5.6

6
Mahesh Patil

MYISAM

MYISAM zapewnia blokowanie na poziomie tabeli, wyszukiwanie FULLTEXT. MYISAM ma najbardziej elastyczną obsługę kolumn AUTO_INCREMENTED we wszystkich silnikach pamięci. MYISAM nie obsługuje transakcji.

INNODB

INNODB to bezpieczny dla transakcji silnik pamięci. INNODB ma funkcje zatwierdzania, wycofywania i odzyskiwania po awarii. INNODB obsługuje integralność referencyjną klucza obcego.

6
Anto

MyISAM

MyISAM to silnik pamięci masowej dla MySQL. Przed MySQL 5.5 był domyślnym silnikiem pamięci MySQL. Opiera się on na starszym silniku ISAM. MyISAM jest zoptymalizowany do środowisk z intensywnymi operacjami odczytu, z niewielką liczbą operacji zapisu lub ich brakiem. Powodem, dla którego MyISAM umożliwia szybkie czytanie, jest struktura jego indeksy: każdy wpis wskazuje na rekord w pliku danych, a wskaźnik jest przesunięty względem początku pliku. W ten sposób rekordy można szybko odczytać, zwłaszcza gdy format jest STAŁY. A zatem wiersze mają stałą długość. A typowym obszarem, w którym można preferować MyISAM, jest hurtownia danych, ponieważ obejmuje zapytania dotyczące bardzo dużych tabel, a aktualizacja takich tabel odbywa się, gdy baza danych nie jest używana (zwykle w nocy). Wkładki są również łatwe, ponieważ nowe wiersze są dołączane na końcu pliku danych. Operacje usuwania i aktualizacji są jednak bardziej problematyczne: usuwanie musi pozostawić puste miejsce, w przeciwnym razie przesunięcia wierszy ulegną zmianie; to samo dotyczy aktualizacji, ponieważ długość wierszy staje się krótsza; jeśli aktualizacja wydłuży wiersz, wiersz zostanie pofragmentowany ent wiersze i zajmują puste miejsce, OPTIMIZE TABLE należy wykonać polecenie. Z powodu tego prostego mechanizmu statystyki indeksu MyISAM zwykle są dość dokładne. Inne główne wady MyISAM to brak obsługi transakcji i kluczy obcych.

InnoDB

InnoDB to silnik pamięci dla MySQL. MySQL 5.5 i nowsze wersje używają go domyślnie. Zapewnia standardowe funkcje transakcji zgodne z ACID, a także obsługę klucza obcego (deklaratywna integralność referencyjna). Implementuje transakcje SQL i XA, obszary tabel, indeksy FULLTEXT oraz operacje przestrzenne zgodne ze standardem OpenGIS. Jest standardowo dołączany do większości plików binarnych dystrybuowanych przez MySQL AB, z wyjątkiem niektórych wersji OEM. Oprogramowanie jest podwójnie licencjonowane przez Oracle Corporation; jest rozpowszechniany na podstawie Powszechnej Licencji Publicznej GNU), ale może być również licencjonowany dla stron, które chcą połączyć InnoDB z zastrzeżonym oprogramowaniem.

Widelce

MariaDB ma silnik pamięci o nazwie Aria, który jest opisany jako „bezpieczna w razie awarii alternatywa dla MyISAM”. MariaDB i Percona Server domyślnie używają rozwidlenia InnoDB o nazwie XtraDB. XtraDB jest utrzymywany przez Percona. Zmiany w Oracle InnoDB są regularnie importowane do XtraDB, a także niektóre poprawki błędów i dodatkowe funkcje.

4
wogsland