Co jest InnoDB
i jest MyISAM
w MySQL
?
Co jest InnoDB
i jest MyISAM
w MySQL
?
Odpowiedzi:
InnoDB
i MYISAM
są silnikami pamięci masowej dla MySQL
.
Te dwa różnią się implementacją blokowania: InnoDB
blokuje określony wiersz w tabeli i MyISAM
blokuje całą MySQL
tabelę.
Możesz określić typ, podając MYISAM
OR InnoDB
podczas tworzenia tabeli w DB.
Spójrz na
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ść.
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.
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:
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.
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
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.
InnoDB jest domyślnym NOT myISAM https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html „InnoDB jest domyślnym silnikiem pamięci masowej MySQL. O ile nie skonfigurowano innego domyślnego silnika pamięci masowej, wydanie Instrukcja CREATE TABLE bez klauzuli ENGINE = tworzy tabelę InnoDB "