Jaka jest różnica między InnoDB a MyISAM?


17

Używam MySQL jako mojej bazy danych dla mojego obecnego projektu internetowego. Jestem nowy w MySQL. Proszę wyjaśnić mi różnicę między InnoDB a MyISAM.


dodaj też tagg MySQL :)
Johan

Czy to nie należy do stackoverflow?
ripper234,

@ ripper234. Dwie lepsze wersje tego postu (znacznie więcej tła; więcej demonstracji wcześniejszych badań) istnieją na SO: stackoverflow.com/q/12614541/209139 i stackoverflow.com/q/20148/209139 .
TRiG

Odpowiedzi:


14

ISAM = Indeksowana metoda sekwencyjnego dostępu i jest zasadniczo płaskim plikiem (dla tych DBA, którzy pamiętają, myślą Btrieve lub B-Tree). To bardzo stara technologia - ale nie zniechęcaj się do jej używania. Ponieważ jest to plik płaski (więcej o tym później), nie jest relacyjny, a zatem nie jest RDBMS, a zatem jest bardziej odpowiedni w niektórych sytuacjach.

InnoDB to pełny RDBMS, jak najprawdopodobniej znasz. MyISAM może wydawać się relacyjny poprzez kolejną warstwę dodaną na górze, która utrzymuje twoje linki, logikę i spójność referencyjną.

ISAM jest genialny, jeśli masz dużo rekordów (np. 20 milionów), a rekordy są w większości samodzielne (tj. Nie musisz robić wielu linków, aby odzyskać powiązane dane). Bardzo mocno opiera się na indeksach, a jeśli nie masz odpowiedniego indeksu, przygotuj się na bardzo długie czasy zapytań. Przykład: mieliśmy tabelę Btrieve ISAM z ponad 20 milionami rekordów, a wyszukiwanie i filtrowanie danych w oparciu o dokładny indeks było niemal natychmiastowe. Zastosowanie niewłaściwego indeksu trwało dosłownie 15 minut.

InnoDB jest świetny, jeśli masz wiele linków relacyjnych. Tabela A odwołuje się do pola w tabeli B, które odwołuje się do tabeli C i D. InnoDB może pobrać te rekordy przy użyciu różnego rodzaju fajnych metod łączenia (łączenia skrótów itp.), Podczas gdy baza danych ISAM musiałaby uruchamiać wiele podkwerend dla każdego pojedynczego wiersz i dopasuj rekordy ręcznie.

Naprawdę będziesz musiał zrobić kurs w bazach danych, jeśli chcesz znacznie więcej szczegółów!


ISAM jest tak samo relacyjny jak wszystko inne, po prostu nie jest dla niego zoptymalizowany.
LapTop006,

dzięki 4 twój krótki opis. Teraz w zasadzie jestem wyczyszczony

5

Najbardziej podstawowe jest to, że InnoDB jest transakcyjny. MyIsam nie jest. MyIsam jest generalnie nieco szybszy, więc jeśli nie potrzebujesz transakcji, jest to na ogół najlepszy wybór. Aby uzyskać szczegółowe opisy, powinieneś przeczytać dokumentację MySQL.


2

Obecnie, chyba że używasz tabeli dla danych w stylu dziennika (dużo więcej INSERT niż SELECT, brak transakcji) InnoDB jest zwykle szybszy, bardziej niezawodny, ma więcej funkcji itp.

Jedyną inną funkcją, jaką ma MyISAM, jest wyszukiwanie pełnotekstowe, które jest odpowiednie do podstawowego użytku, ale większość ludzi korzysta z Lucene do czegoś poważnego.

Tak czy inaczej, musisz dostroić MySQL, ponieważ ustawienia domyślne są zasadniczo ustawione na pentium 32 MB, które jest współdzielone z innymi usługami.


2

Trochę za późno na grę ... ale oto dość obszerny post, który napisałem kilka miesięcy temu , opisują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 na inną tabelę (np. Produkty), gdy aktualizacje lub usunięcia mają miejsce 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”, wszelkie wykazy wskazujące na usunięty wpis również zostaną usunięte. 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ą niezmienione, 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 ona 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 wykonujesz 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 rejestruje 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ę usług hostingowych 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.


1

Ogólnie rzecz biorąc, ogólna zasada jest taka, że ​​jeśli chcesz prędkości, użyj MyISAM, a jeśli chcesz stabilności, użyj InnoDB. Coś wspólnego z atomizmem, jeśli dobrze pamiętam.


3
Fragment, który nie jest już prawdą, InnoDB jest w rzeczywistości szybszy w większości przypadków.
LapTop006,

1
czy ktoś może dodać link jakieś testy porównawcze lub coś ...?
Johan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.