Co to jest InnoDB i MyISAM w MySQL?


122

Co jest InnoDBi jest MyISAMw MySQL?



To silnik bazy danych ... kavoir.com/2009/09/…
Matthieu

czy możemy używać obu silników pamięci masowej w tym samym czasie dla naszej bazy danych?
user130561

1
Możesz je jednocześnie na różnych stołach, ale dla jednego podanego stołu będziesz musiał wybrać, którego chcesz użyć ...
Matthieu

Odpowiedzi:


111

InnoDBi MYISAMsą silnikami pamięci masowej dla MySQL.

Te dwa różnią się implementacją blokowania: InnoDBblokuje określony wiersz w tabeli i MyISAMblokuje całą MySQLtabelę.

Możesz określić typ, podając MYISAMOR InnoDBpodczas tworzenia tabeli w DB.


Jasna i prosta odpowiedź.
vadiraj jahagirdar

38

Spójrz na

InnoDB i MyISAM

InnoDB to mechanizm przechowywania danych dla MySQL, który jest standardem we wszystkich aktualnych plikach binarnych dystrybuowanych przez MySQL AB. Jego głównym ulepszeniem w stosunku do innych silników pamięci masowej dostępnych do użytku z MySQL jest obsługa transakcji zgodna z ACID

MyISAM jest domyślnym silnikiem pamięci masowej dla systemu zarządzania relacyjnymi bazami danych MySQL w wersjach wcześniejszych niż 5.5 1 . Jest oparty na starszym kodzie ISAM, ale ma wiele przydatnych rozszerzeń. Główną wadą MyISAM jest brak obsługi transakcji. Wersje MySQL 5.5 i nowsze przeszły na silnik InnoDB, aby zapewnić ograniczenia integralności referencyjnej i wyższą współbieżność.


1
czy możemy używać obu silników pamięci masowej w tym samym czasie dla naszej bazy danych?
user130561

2
możesz, ponieważ dla każdej tabeli możesz zdefiniować inny mechanizm przechowywania. inne pytanie brzmi, czy powinieneś. w dokumentacji mysql znajduje się kilka wyjaśnień na ten temat.
nano7

18

To silniki magazynowe.

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

MyISAM: domyślny silnik pamięci masowej MySQL, który jest najczęściej używany w sieci Web, hurtowniach danych i innych środowiskach aplikacji. MyISAM jest obsługiwany we wszystkich konfiguracjach MySQL i jest domyślnym silnikiem pamięci masowej, chyba że skonfigurowano MySQL tak, aby domyślnie używał innego.

InnoDB: bezpieczny dla transakcji (zgodny z ACID) silnik pamięci masowej dla MySQL, który ma funkcje zatwierdzania, wycofywania i odzyskiwania po awarii w celu ochrony danych użytkownika. Blokowanie na poziomie wiersza InnoDB (bez eskalacji do blokad o grubszej ziarnistości) i spójne odczyty nieblokujące w stylu Oracle zwiększają współbieżność i wydajność wielu użytkowników. InnoDB przechowuje dane użytkownika w indeksach klastrowych, aby zmniejszyć liczbę operacji we / wy dla typowych zapytań opartych na kluczach podstawowych. Aby zachować integralność danych, InnoDB obsługuje również ograniczenia integralności referencyjnej klucza obcego.


Czy więc podczas instalowania MySQL musimy konkretnie określić, który silnik pamięci masowej będzie używany jako nasza baza danych MySQL?
user130561

3
Jak wspomniałem w moim poście, domyślną wartością jest MyISAM. Jeśli chcesz korzystać z funkcji innego mechanizmu przechowywania, takiego jak INNODB, musisz to określić. Nie jest to wykonywane podczas instalacji, a raczej podczas początkowego tworzenia tabeli.
mluebke

3
Ale zgodnie z tym: - dev.mysql.com/doc/refman/5.7/en/storage-engines.html ; Domyślnym silnikiem jest InnoDB.
Harsha

2
Według dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html : „Domyślnym silnikiem jest InnoDB od MySQL 5.5.5 (MyISAM przed 5.5.5)” Tak więc domyślnym silnikiem jest teraz InnoDB. Ta odpowiedź została opublikowana 16 dni po pierwszym
ogólnodostępnym

6

Chciałem dodać, że możliwość określenia konkretnego silnika pamięci masowej na tabelę jest jedną z kluczowych zalet MySQL (oprócz łatwości użytkowania i dobrej wydajności bez modyfikowania). W przypadku wszystkich operacji, w których potrzebne są transakcje, po prostu trzymaj się InnoDB. Jednak MyISAM może naprawdę przyspieszyć działanie, gdy transakcje nie są potrzebne w określonych sytuacjach - i wymaga mniej miejsca na dysku i pamięci RAM w porównaniu do InnoDB.

To powiedziawszy, InnoDB cały czas się poprawia:

Ulepszenia wydajności i skalowalności InnoDB 1.1


4

MyISAM nie śledzi ACID w przeciwieństwie do InnoDB, który śledzi transakcje w celu zachowania integralności danych.

MyISAM obsługuje współbieżne wstawianie: Jeśli tabela nie ma wolnych bloków w środku pliku danych, możesz WSTAWIAĆ do niej nowe wiersze w tym samym czasie, gdy inne wątki czytają z tabeli. MySqlDoc

Dlatego MyISAM jest szybszy i zajmuje mniej miejsca. Na przykład MySQL MyISAM Storage Engine nie obsługuje transakcji. ograniczenia MySQL MYISAM Istnieje bit o nazwie współbieżne wstawianie. Domyślnie zmienna ma wartość 1 i współbieżne wstawianie jest obsługiwane tak, jak opisano powyżej . Jeśli jest ustawiony na 0, współbieżne wstawianie jest wyłączone. Jeśli jest ustawiony na 2, współbieżne wstawienia na końcu tabeli są dozwolone nawet w przypadku tabel, które mają usunięte wiersze. Polecenie INSERT może zostać wykonane w celu dodania wierszy na końcu tabeli z zaznaczeniem w tym samym czasie, jeśli nie ma żadnych otworów / usuniętych wierszy w środku tabeli (w czasie równoczesnego wstawiania).

Domyślny poziom izolacji w mysql InnoDB to „Read Repeatable”. W przypadku MyISAM nie ma transakcji. InnoDB używa blokowania na poziomie wierszy, podczas gdy MyISAM może używać tylko blokowania na poziomie tabeli, dlatego InnoDB ma lepsze odzyskiwanie po awarii niż MyISAM. Aby uniknąć efektów współbieżności, należy ręcznie uzyskać blokadę poziomu tabeli w MyISAM.


3

InnoDB to transakcyjny silnik pamięci masowej MySQL, podczas gdy MyISAM jest nietransakcyjnym silnikiem pamięci masowej. Innymi słowy, InnoDB postępuje zgodnie z właściwościami ACID, aby zachować integralność danych, ale MyISAM nie podąża za właściwościami ACID, co nie pozwala na zachowanie integralności danych.

W tabeli InnoDB (transakcyjnej) zmiany transakcyjne można łatwo cofnąć, jeśli wymagane jest wycofanie. Jednak zmian wprowadzonych w tabeli MyISAM (nietransakcyjnej) nie można cofnąć, gdy wymagane jest wycofanie transakcji.

Na przykład chcesz przelać pieniądze ze swojego konta rozliczeniowego na konto oszczędnościowe. Odbywa się to poprzez transakcję, która obejmuje 5 zapytań.

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;

Załóżmy, że proces ulega awarii w kroku 4. Jeśli w tym miejscu użyto tabeli InnoDB, wycofanie cofnie zmiany i zostaniesz oszczędzony przed ryzykiem utraty pieniędzy. Dosłownie tabela nie jest świadoma żadnej awarii, ponieważ zmiany nie zostaną zatwierdzone do tabeli, chyba że krok 5 zostanie pomyślnie wykonany.

Ale w przypadku tabeli MyISAM nie można cofnąć zmian transakcyjnych, gdy wywoływana jest funkcja wycofywania lub w przypadku awarii prowadzącej do niepowodzenia transakcji. Oznacza to, że jeśli transakcja uległa awarii w kroku 3, pieniądze zostaną pobrane z Twojego konta rozliczeniowego. Ale pieniądze nie zostałyby dodane do twojego konta oszczędnościowego.

Przykład dzięki uprzejmości: „MySQL o wysokiej wydajności: optymalizacja, kopie zapasowe i replikacja” - książka autorstwa Arjena Lentza, Dereka J. Ballinga, Jeremy'ego Zawodnego, Petera Zaitseva i Vadima Tkachenko


1

Gdy Twój serwer MySQL ulegnie awarii, dane można odzyskać znacznie łatwiej z zestawu tabel MyISAM niż z tego dużego pliku transakcyjnego InnoDB. Każda tabela MyISAM ma oddzielny plik i jeśli podczas awarii nie były wykonywane żadne operacje zapisu w tej tabeli - pozostanie to całkowicie nienaruszone. W przypadku InnoDB cały plik transakcji całego serwera MySQL musi zostać ponownie zindeksowany lub cokolwiek robi po awarii. To może być dość niechlujne.


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.