Jakie są główne różnice między InnoDB i MyISAM?
Jakie są główne różnice między InnoDB i MyISAM?
Odpowiedzi:
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 FULLTEXT
indeksów wyszukiwania 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. Oboje 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 ):
FULLTEXT
indeksy wyszukiwania, InnoDB zrobił to dopiero MySQL 5.6 (luty 2013).version 5.6.4
InnoDB obsługuje FULLTEXT
wyszukiwanie. dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
Inną zasadniczą różnicą, o której jeszcze nie wspomniano, jest sposób buforowania każdego silnika pamięci masowej.
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 dla pamięci podręcznej kluczy MyISAM ( key_buffer_size ) biorąc pod uwagę twój aktualny zestaw danych ( zapytanie ograniczy rekomendację do 4G (4096M). W przypadku 32-bitowego systemu operacyjnego limit to 4 GB. W przypadku 64-bitowego 8 GB.
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;
Da to 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:
service mysql stop
rm /var/log/mysql/ib_logfile[01]
service mysql start
(ib_logfile0 i ib_logfile1 są odtwarzane)Na końcu obu zapytań znajduje się zapytanie wbudowane
(SELECT 2 PowerOf1024)
B
(SELECT 0 PowerOf1024)
daje ustawienie w bajtach(SELECT 1 PowerOf1024)
daje ustawienie w kilobajtach(SELECT 2 PowerOf1024)
daje ustawienie w megabajtach(SELECT 3 PowerOf1024)
daje ustawienie w gigabajtachNic 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.
Możliwe scenariusze są nieograniczone !!!
Pamiętaj, bez względu na to, na co przeznaczasz, pozostaw wystarczającą ilość pamięci RAM na połączenia DB i system operacyjny.
InnoDB oferuje:
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 (kiedy WHERE
, GROUP BY
lub JOIN
nie jest używany) działa 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 zarówno danych, jak i indeksów.
MyISAM oferuje:
COUNT(*)
s (w przypadku WHERE
, GROUP BY
albo JOIN
nie jest używana)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.
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. W celu umożliwienia standardowego dostępu do niej ze strony PHP, to MyISAM jest w porządku (tzn. Jest lepszy niż płaski plik CSV lub plik dziennika do zapytań i równoczesny dostęp). Jeśli baza danych jest faktyczną „główną kopią” danych, jeśli robisz INSERT
i UPDATE
używasz prawdziwych danych od użytkowników, głupotą jest używanie czegokolwiek innego niż InnoDB, w jakiejkolwiek skali MyISAM jest zawodny i trudny do zarządzania, ty Będę robił myisamchk
połowę czasu, negując jakiekolwiek zyski wydajności ...
(Moje osobiste doświadczenie: 2 terabajtowa baza danych w MyISAM).
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.
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), kiedy 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.
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.
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 .
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
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.
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.
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.
Z mojego doświadczenia wynika, że najbardziej znaczącą różnicą jest sposób, w jaki każdy silnik obsługuje blokowanie. InnoDB używa blokowania wierszy, a 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ą:
FULLTEXT
i SPATIAL
. InnoDB jest dobry zarówno dla obciążeń o wysokim stopniu odczytu, jak i zapisu.
Zazwyczaj postrzegam MyISAM jako „domyślną” tabelę dla MySQL, więc wskazuję różnice dla większości użytkowników InnoDB
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.
Obejmuje zmiany w MySQL 5.6
SILNIK DO PRZECHOWYWANIA INNODB:
Więc nie ma sensu używać MyISAM
Engine, jeśli jesteś już uaktualniony do wersji 5.6, jeśli nie, nie czekaj na aktualizację do MySQL 5.6.
MyISAM to silnik pamięci masowej dla MySQL. Przed MySQL 5.5 był domyślnym silnikiem pamięci MySQL. Opiera się na starszym silniku pamięci ISAM. MyISAM jest zoptymalizowany do środowisk z intensywnymi operacjami odczytu, z niewielką liczbą zapisów lub wcale. Powodem, dla którego MyISAM pozwala na szybkie odczytywanie, jest struktura jego indeksów: 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 mogą być szybko odczytywane, szczególnie gdy format jest NAPRAWIONY. Tak więc rzędy mają stałą długość. 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). Wstawki są również łatwe, ponieważ nowe wiersze są dołączane na końcu pliku danych. Jednak, operacje usuwania i aktualizacji są 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. Aby defragmentować wiersze i przejąć puste miejsce, należyOPTIMIZE TABLE
polecenie musi zostać wykonane. 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 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, FULLTEXT
indeksy i operacje przestrzenne zgodnie 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 w oprogramowaniu prawnie zastrzeżonym.
MariaDB ma silnik pamięci o nazwie Aria, który jest opisany jako „bezpieczna 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.