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


180

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

+13

Jeśli chcesz silnik bazy danych, użyj InnoDB.[Nie można ich porównać] (https://jeremystein.com/journal/innodb-versus-myisam-no-comparison/). 10 sty. 132013-01-10 15:12:50

112

Pierwszą główną różnicą, jaką widzę, jest to, że InnoDB implementuje blokowanie na poziomie wiersza, podczas gdy MyISAM może wykonywać tylko blokadę na poziomie tabeli.W InnoDB znajdziesz lepsze odzyskiwanie po awarii.Jednak nie ma FULLTEXT indeksów wyszukiwania do wersji 5.6, podobnie jak MyISAM.InnoDB implementuje również transakcje, klucze obce i ograniczenia relacji, podczas gdy MyISAM nie.

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

Podsumowując (TL; DR):

  • InnoDB ma blokowanie na poziomie wiersza, MyISAM może wykonywać tylko blokowanie na poziomie pełnego stołu.
  • InnoDB ma lepsze odzyskiwanie po awarii.
  • MyISAM ma FULLTEXT indeksów wyszukiwania, InnoDB nie zrobił aż do MySQL 5.6 (luty 2013).
  • InnoDB implementuje transakcje, klucze obce i ograniczenia relacji, MyISAM nie.
  0

drogi panie, więc ostatecznie co należy użyć?MyISAM czy InnoDB?jestem całkowicie zdezorientowany ... moja strona używa mysql i muszę to zdecydować. 30 sie. 122012-08-30 11:44:30

+2

zależy od aplikacji, zapisz listę z funkcjami, których potrzebujesz (np. wyszukiwanie pełnotekstowe, klucze obce ...) i spróbuj wybrać jedną (spróbuj ocenić każdą funkcję, a następnie policz wynik).nie będziesz w stanie mieć ich wszystkich, ale to od Ciebie zależy, czy najbardziej będzie potrzebna funkcja. 30 sie. 122012-08-30 12:14:29

+2

Zmodyfikowałem jego post w celu wyjaśnienia. 23 lip. 132013-07-23 06:24:14

+1

@MathiasLykkegaardLorenzen dzięki, to jeden z powodów, dla których lubimy stackexchange 25 lip. 132013-07-25 23:37:26

  0

od 'wersja 5.6.4' InnoDB obsługuje wyszukiwanie' FULLTEXT'.https://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html 02 lis. 142014-11-02 04:34:25

  0

InnoDB nie pamięta wartości automatycznego przyrostu (zapomina o nich przy ponownym uruchomieniu). 10 lut. 182018-02-10 03:26:03

  0

@sqlchild, Jeśli serwer WWW absorbuje dane od klienta, lepiej użyj InnoDB, funkcja klucza obcego jest niezbędna do utrzymania bazy danych w spójnym stanie. 03 mar. 182018-03-03 19:08:23


16

Z mojego doświadczenia wynika, że ​​najważniejszą różnicą jest sposób, w jaki każdy silnik obsługuje blokowanie.InnoDB używa blokowania wierszy, podczas gdy MyISAM używa blokowania tabel.Jako regułę używam InnoDB do pisania ciężkich tabel i MyISAM do czytania ciężkich tabel.

Inne ważne różnice obejmują:

  1. Obsługa transakcji InnoDB i klucze obce.MyISAM nie.
  2. MyISAM używa pełnego indeksowania tekstu.
  3. MyISAM nie radzi sobie z wymuszaniem integralności danych.

7

MyISAM uważam za „domyślny” wybór tabeli dla MySQL, więc wskażę różnice dla większości użytkowników InnoDB

  • Blokowanie na poziomie wiersza
  • Egzekwowanie klucza obcego
  • Obsługa transakcji
  • Uderzenie wydajności w systemy o wysokiej wydajności
+4

z wyjątkiem najnowszej wersji MySQL nie używa już MyISAM jako domyślnego silnika.W wersji 5.5 zmienili domyślnie na InnoDB :).I nie zgodziłbym się z generalizacją, że InnoDB generalnie dostaje „hit wydajności”.Dobrze zaprojektowane tabele InnoDB z odpowiednim indeksowaniem i dobrze skonfigurowanymi ustawieniami pamięci mogą sprawić, że tabela InnoDB będzie działać tak samo, jak ten sam schemat w MyISAM 24 cze. 112011-06-24 13:44:30

+3

W wielu sytuacjach „high-use” InnoDB rzeczywiście działa [lepiej] (http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/) niż MyISAM.MyISAM jest specyficznym narzędziem do konkretnego problemu, podczas gdy InnoDB będzie ci lepiej służyć w większości sytuacji (dlatego zespół MySQL uczynił go domyślnym silnikiem).To dlatego, że MyISAM był jedynym silnikiem od dawna, w którym społeczność MySQL nabrała zwyczaju używania MyISAM domyślnie, nawet po dojrzewaniu InnoDB. 15 sie. 112011-08-15 19:53:08

+2

Wyszukiwanie FULLTEXT dla InnoDB zostało dodane w ramach cyklu rozwojowego MySQL 5.6.[Podany adres URL] (http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html) obejmuje również InnoDB. 20 gru. 122012-12-20 06:52:59


26

Jeszcze jedno: możesz tworzyć kopie zapasowe tabel InnoDB tylko przez wykonanie migawki systemu plików.Tworzenie kopii zapasowej MyISAM wymaga użycia mysqldump i nie ma gwarancji, że będzie spójny (np. Jeśli wstawisz do tabeli nadrzędnej i podrzędnej, możesz znaleźć tylko wiersz tabeli podrzędnej w kopii zapasowej).

Zasadniczo, jeśli masz inną kopię danych i buforujesz ją tylko w MySQL, np. Aby umożliwić standardowy sposób dostępu do niej ze strony PHP, wtedy MyISAM jest w porządku (tzn. Jest lepszy niż płaski plik CSV lub plik dziennika do odpytywania i dostęp równoległy).Jeśli baza danych jest rzeczywistą „kopią główną” danych, jeśli robisz INSERT i UPDATE używając prawdziwych danych od użytkowników, to głupotą jest używanie czegoś innego niż InnoDB, w jakiejkolwiek skali MyISAM jest zawodny i trudny do zarządzania , będziesz robił myisamchk połowę czasu, negując wzrost wydajności ...

(Moje osobiste doświadczenie: 2 terabajty DB w MyISAM).


64

Inną istotną różnicą, o której jeszcze nie wspomniano, jest sposób, w jaki buforowanie dla każdego silnika pamięci masowej jest wykonywane.

MYISAM

Głównym mechanizmem jest pamięć podręczna kluczy.Buforuje tylko strony indeksu z plików .MYI.Aby zmienić rozmiar pamięci podręcznej klucza, 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;

Daje to zalecane ustawienie dla MyISAM Key Cache (key_buffer_size), biorąc pod uwagę aktualny zestaw danych (the query will cap the recommendation at 4G (4096M). Dla 32-bitowego systemu operacyjnego, limit 4 GB. Dla 64-bitowych, 8 GB.

InnoDB

Głównym wykorzystywanym mechanizmem jest pula buforów InnoDB.Buforuje dane i strony indeksu z dostępnych tabel InnoDB.Aby zmienić rozmiar 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;

Spowoduje to ustawienie zalecane dla wielkości puli buforów InnoDB (innodb_buffer_pool_size) z uwzględnieniem bieżącego zestawu danych.

Nie zapomnij zmienić rozmiaru plików dziennika InnoDB (ib_logfile0 i ib_logfile1).Kod źródłowy MySQL umieszcza pułap połączonych rozmiarów wszystkich plików dziennika InnoDB musi być <4G (4096M). Dla uproszczenia, biorąc pod uwagę tylko dwa pliki dziennika, oto jak możesz je rozmiarować:

  • Krok 1) Dodaj innodb_log_file_size = NNN do /etc/my.cnf(NNN powinno 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 (odtworzono plik ib_logfile0 i ib_logfile1)

CAVEAT

Na końcu obu zapytań znajduje się Zapytanie Inline (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
  • Żadna moc mniej niż 0 lub więcej niż 3 jest akceptowana

EPILOG

Nie ma substytutu zdrowego rozsądku.Jeśli masz ograniczoną pamięć, mieszankę silników pamięci masowej 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 innodb_buffer_pool.
  • Jeśli masz 2 GB pamięci RAM i 4 GB indeksów MyISAM, przydziel 512M jako key_buffer_size.
  • Jeśli masz 2 GB pamięci RAM i 4 GB indeksów MyISAM i 16 GB InnoDB, przydziel 512M jako key_buffer_size i 512M jako innodb_buffer_pool_size.

Możliwe scenariusze są nieograniczone!

Pamiętaj, że cokolwiek przeznaczysz, pozostaw wystarczającą ilość pamięci RAM dla połączeń DB i systemu operacyjnego.

  0

To są złe formuły! 23 cze. 112011-06-23 00:06:29

  0

(ups - zapominaj, że nie może mieć akapitów) ... Dodam „odpowiedź”. 23 cze. 112011-06-23 00:07:21

  0

W rzeczywistości dałam @Rick +1 za odpowiedź w odniesieniu do środowisk o niskiej pamięci.Moja odpowiedź, nawet używając jego adresu URL z jego odpowiedzi, została potwierdzona jako poprawna.Od tego momentu pozostawiam społeczności DBA.SE ocenę wszystkich odpowiedzi w pełnym kontekście.Dziękuję Ci !!! 23 cze. 112011-06-23 02:51:42

  0

Formuły Rolando dla rozmiarów pamięci podręcznej nie są praktyczne.- Uprawnienia 2 nie są potrzebne.- 4 GB w 32-bitowym systemie operacyjnym jest niemożliwe - Itd. Oto moje zestawienie na temat tego, na co je ustawić: http://mysql.rjweb.org/doc.php/memory (Adresuje różne inne ustawienia wpływające na wykorzystanie pamięci .) 23 cze. 112011-06-23 00:13:03

+2

@Rick: Moc 2 miała wyświetlać odpowiedzi w różnych jednostkach.Wykonywanie (SELECT 2 PowerOfTwo) Ustawia wyświetlanie odpowiedzi w MB.Wykonywanie (SELECT 3 PowerOfTwo) Ustawia wyświetlanie w GB.(SELECT 1 PowerOfTwo) Wyświetla w KB.(SELECT 0 PowerOfTwo) Wyświetla w bajtach.To właśnie robi (SELECT 2 PowerOfTwo).Dlatego konieczne jest WYŚWIETLANIE TYLKO, nie narzucanie żadnych założonych wartości w architekturze. 23 cze. 112011-06-23 02:25:59

  0

@Rick: Dokumentacja witryny MySQL mówi, że maks. 4 GB dla 32-bitowego systemu operacyjnego: Maksymalne dopuszczalne ustawienie key_buffer_size to 4 GB na platformach 32-bitowych.Wartości większe niż 4 GB są dozwolone dla platform 64-bitowych.Efektywny maksymalny rozmiar może być mniejszy, w zależności od dostępnej fizycznej pamięci RAM i limitów pamięci RAM na proces narzuconych przez system operacyjny lub platformę sprzętową.Wartość tej zmiennej wskazuje ilość żądanej pamięci.Wewnętrznie serwer przydziela tyle pamięci, ile to możliwe, do tej kwoty, ale rzeczywista alokacja może być mniejsza. 23 cze. 112011-06-23 02:30:58

  0

@Rick: Tak mówi ten adres URL (http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_key_buffer_size), bezpośrednio z dokumentacji MySQL.Jeśli dokumentacja jest błędna, poinformuj MySQL (eh Oracle). 23 cze. 112011-06-23 02:32:19

  0

@Rick: Nawet twój adres URL (http://mysql.rjweb.org/doc.php/memory) wyraźnie mówi: Po pierwsze, system operacyjny (i sprzęt?) Może spiskować, aby nie pozwolić ci na używanie wszystkich 4 GB, jeśli tak jest ty masz.Jeśli masz więcej niż 4 GB pamięci RAM, nadmiar przekraczający 4 GB jest całkowicie niedostępny i nie nadaje się do użytku.To jest dokładnie to, co 4 GB jest poprawne z dokumentacji MySQL i własnego adresu URL, który podałeś. 23 cze. 112011-06-23 02:37:15

+2

@ Ric: Wiesz co?W rzeczywistości dam ci +1 z dwóch bardzo ważnych powodów.1) Twój adres URL potwierdza, że ​​moja odpowiedź była poprawna, ponieważ 4 GB jest największą liczbą przypisaną do klucza key_buffer_size.2) Twoja odpowiedź wraz z adresem URL ma sens dla maszyn o bardzo małej pamięci.Udzielę kredytu tam, gdzie należny jest kredyt. 23 cze. 112011-06-23 02:41:27

  0

@Rick: Nie chcę być gadatliwy, ale gdybyś przeczytał moją ostatnią notatkę z mojej odpowiedzi, zauważyłbyś, że jasno stwierdzam, że używam 512 MB dla innodb_buffer_pool_size i key_buffer_size.Staram się zachowywać ostrożnie przy niskim poziomie pamięci.Jestem w pełni świadomy, że formuły takie jak moje nie są absolutne. 23 cze. 112011-06-23 02:48:45


42

InnoDB oferuje:

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

We InnoDB wszystkie dane z rzędu oprócz TEXT i BLOB mogą zajmować co najwyżej 8 000 bajtów.Indeksowanie pełnego tekstu nie jest dostępne w InnoDB do wersji MySQL 5.6 (luty 2013).W InnoDB COUNT(*) s (gdy WHERE , GROUP BY lub JOIN nie są używane) wykonuje się wolniej 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 danych i indeksów.

MyISAM oferuje:

  • szybko COUNT(*) s (gdy WHERE , GROUP BY lub JOIN nie są używane)
  • pełne indeksowanie tekstu (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-tree) (aktualizacja: obsługiwane w InnoDB z MySQL 5.7)

MyISAM ma blokowanie na poziomie tabeli, ale nie ma blokowania na poziomie wiersza.Brak transakcji.Brak automatycznego odzyskiwania po awarii, ale oferuje funkcjonalność tabeli napraw.Brak ograniczeń klucza obcego.Tabele MyISAM są na ogół bardziej kompaktowe na dysku w porównaniu z tabelami InnoDB.Tabele MyISAM mogą być dalej znacznie zmniejszane przez kompresowanie za pomocą myisampacku, jeśli to konieczne, ale stają 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 systemowi operacyjnemu.

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.

+2

Przeczytałem twoją odpowiedź i porównałem ją z innymi już tutaj.Twój jedyny wspomina o BLOBach.Zwykle są brane za pewnik.Twój jest także jedynym, który wspomina o myisampacku, jednym z niedocenianych bohaterów szybkich tabel MyISAM.Twój jest dzisiaj +1 !!! 23 sie. 112011-08-23 03:45:37


3

MYISAM

MYISAM zapewnia blokowanie na poziomie tabeli, wyszukiwanie FULLTEXT.MYISAM ma najbardziej elastyczną obsługę kolumny AUTO_INCREMENTED poza wszystkimi silnikami pamięci. MYISAM nie obsługuje transakcji.

INNODB

INNODB jest bezpieczną transakcją storage.INNODB ma możliwości commit, rollback i crash-recovery.INNODB obsługuje integralność referencyjną kluczy obcych.


4

Obejmuje zmiany MySQL 5.6

INNODB SILNIK PRZECHOWYWANIA:

  • Zapewnia pełną zgodność z ACID (atomowość, spójność, izolacja, trwałość).Multi-wersja jest używana do izolowania transakcji od innych.
  • 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 bazuje na platformie InnoDB w pełni zintegrowanej jako domyślny mechanizm przechowywania
  • Persistent Optimizer Stats : zapewnia lepszą dokładność statystyk indeksu InnoDB i spójność w ponownym uruchamianiu MySQL.
  • Czyszczenie pamięci podręcznej tabeli InnoDB: Aby zmniejszyć obciążenie pamięci w systemach o dużej liczbie tabel, InnoDB zwalnia pamięć związaną z otwartą tabelą.Algorytm LRU wybiera tabele, które przeszły najdłużej bez dostępu do nich.
  • Obsługuje wyszukiwanie pełnotekstowe: specjalny rodzaj indeksu, indeks FULLTEXT, pomaga InnoDB radzić sobie z zapytaniami i operacjami DML obejmującymi kolumny tekstowe i słowa, które zawierają.Te indeksy są fizycznie reprezentowane jako całe tabele InnoDB.
  • InnoDB wydaje się być szybszy w wyszukiwaniu pełnotekstowym niż MyISAM

Tak więc nie ma sensu używać silnika MyISAM jeśli zostałeś już zaktualizowany do wersji 5.6, jeśli nie, nie czekaj na aktualizację do MySQL 5.6.

InnoDB VS MyISAM performance using MySQL 5.6


17

Trochę późno do gry ... ale tutaj jest dość obszerny post I wrote a few months back , opisujący główne różnice między MYISAM a InnoDB.Weź filiżankę (i może herbatnik) 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 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. Listings) ma klucz obcy (np. ID produktu) wskazujący na inną tabelę (np. Produkty), gdy aktualizacje lub usunięcia pojawią się w tabeli wskazanej, zmiany te są kaskadowane do linkowania stół.W naszym przykładzie, jeśli nazwa produktu zostanie zmieniona, klucze obce tabeli łączącej również zostaną zaktualizowane;jeśli produkt zostanie usunięty z tabeli „Produkty”, wszelkie aukcje wskazujące na usunięty wpis zostaną również usunięte.Ponadto każdy nowy wpis musi mieć ten klucz obcy wskazujący na prawidłowy, istniejący wpis.

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

Transakcje i atomowość

Dane w tabeli są zarządzane za pomocą instrukcji języka manipulacji danymi (DML), takich jak SELECT, INSERT, UPDATE i DELETE.Transakcja grupuje dwa lub więcej instrukcji DML w jedną jednostkę pracy, więc stosowana jest cała jednostka lub żadna z nich.

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

Jeśli operacja zostanie przerwana podczas używania tabeli MyISAM, operacja jest natychmiast przerywana, a wiersze (lub nawet dane w każdym wierszu), których dotyczy problem, pozostają pod wpływem, nawet jeśli operacja nie zakończyła się.

Jeśli operacja zostanie przerwana podczas korzystania z tabeli InnoDB, ponieważ używa transakcji, które mają atomowość, każda transakcja, która nie przeszła do końca, nie odniesie skutku, ponieważ nie zostanie wykonane zatwierdzenie.

Blokowanie tabel vs Blokowanie wierszy

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

Gdy zapytanie działa w stosunku do tabeli InnoDB, tylko zaangażowane wiersze są zablokowane, reszta tabeli pozostaje dostępna dla operacji CRUD.Oznacza to, że zapytania mogą działać 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ść.Tak wielka, jak współbieżność, jest jednak poważna wada, która dotyczy wybranych zakresów tabel, ponieważ istnieje przełączanie między wątkami jądra i należy ustawić limit wątków jądra, aby zapobiec zatrzymaniu serwera .

Transakcje i wycofywanie transakcji

Po uruchomieniu operacji w MyISAM zmiany są ustawiane;w InnoDB zmiany te można cofnąć.Najczęściej używane polecenia do sterowania transakcjami to COMMIT, ROLLBACK i SAVEPOINT.1. COMMIT - możesz napisać wiele operacji DML, ale zmiany zostaną zapisane tylko po wykonaniu COMMIT. 2. ROLLBACK - możesz odrzucić wszystkie operacje, które nie zostały jeszcze zatwierdzone 3. SAVEPOINT - ustawia punkt na liście operacje, do których można cofnąć 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.

Z drugiej strony InnoDB używa dziennika transakcyjnego, bufora podwójnego zapisu oraz automatycznego sprawdzania i sprawdzania poprawności, aby zapobiec korupcji.Zanim InnoDB dokona jakichkolwiek zmian, rejestruje dane przed transakcjami w pliku obszaru tabel o nazwie ibdata1.Jeśli dojdzie do awarii, InnoDB automatycznie przejdzie przez odtwarzanie tych dzienników.

FULLTEXT Indeksowanie

InnoDB nie obsługuje indeksowania FULLTEXT do wersji MySQL 5.6.4.W chwili pisania tego postu, wielu dostawców hostingu udostępnionego MySQL jest nadal poniżej 5.6.4, co oznacza, że ​​indeksowanie FULLTEXT nie jest obsługiwane w tabelach InnoDB.

Nie jest to jednak ważny powód, aby używać MyISAM.Najlepiej zmienić się na dostawcę usług hostingowych, który obsługuje aktualne wersje MySQL.Nie, że tabela MyISAM, która używa indeksowania FULLTEXT, nie może zostać przekonwertowana na tabelę InnoDB.

Wniosek

Podsumowując, InnoDB powinien być twoim domyślnym mechanizmem przechowywania danych.Wybierz MyISAM lub inne typy danych, gdy służą konkretnej potrzebie.


1

MyISAM

MyISAM to silnik pamięci masowej dla MySQL.Przed MySQL 5.5 był to domyślny mechanizm przechowywania MySQL.Opiera się on na starszym silniku pamięci ISAM. MyISAM jest zoptymalizowany dla środowisk z dużymi operacjami odczytu i nielicznymi zapisami lub wcale.Powodem, dla którego MyISAM pozwala na szybkie odczytanie, jest struktura jego indeksów: każdy wpis wskazuje rekord w pliku danych, a wskaźnik jest przesunięty od początku pliku.W ten sposób rekordy można szybko odczytać, zwłaszcza gdy format jest STAŁY.W ten sposób rzędy mają stałą długość.Typowym obszarem, w którym można preferować MyISAM, jest hurtownia danych, ponieważ wymaga zapytań na bardzo dużych tabelach, a aktualizacja takich tabel odbywa się, gdy baza danych nie jest używana (zazwyczaj 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 lub przesunięcia wierszy zmienią się;to samo dotyczy aktualizacji, ponieważ długość rzędów skraca się;jeśli aktualizacja powoduje wydłużenie wiersza, wiersz jest pofragmentowany.Aby zdefragmentować wiersze i zażądać pustej przestrzeni,OPTIMIZE TABLEpolecenie musi zostać wykonane.Z powodu tego prostego mechanizmu zazwyczaj statystyki indeksu MyISAM są dość dokładne.Inne główne wady MyISAM to brak obsługi transakcji i kluczy obcych.

InnoDB

InnoDB to silnik pamięci masowej dla MySQL.MySQL 5.5 i późniejsze 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,FULLTEXTindeksy i operacje przestrzenne zgodne ze standardem OpenGIS. Jest on standardowo dołączany do większości binariów dystrybuowanych przez MySQL AB, z wyjątkiem niektórych wersji OEM.Oprogramowanie jest licencjonowane podwójnie przez Oracle Corporation;jest rozpowszechniany na podstawie Powszechnej Licencji Publicznej GNU, ale może być również licencjonowany na rzecz stron chcących połączyć InnoDB w zastrzeżone oprogramowanie.

Widelce

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