Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 13183|Odpowiedź: 0

[Źródło] MyISAM to różnica między silnikiem pamięci bazowej MySQL a InnoDB

[Skopiuj link]
Opublikowano 13.04.2020 09:53:49 | | |
Jeśli chodzi o MySQL, trudno byłoby zrozumieć MyISAM i InnoDB, które są dwoma z najbardziej znanych i szeroko używanych silników pamięci masowej MySQL. Dziś opowiem Ci o różnicach między MyISAM a InnoDB w MySQL...

Czym jest MyISAM?

MyISAM jest domyślnym silnikiem pamięci masowej dla relacyjnego systemu zarządzania bazą danych MySQL (przed wersją 5.5)。 Ta struktura tabelowej pamięci MySQL rozszerza wiele przydatnych funkcji ze starego kodu ISAM. W nowej wersji MySQL silnik InnoDB szeroko zastępuje MyISAM ze względu na swoje zalety w zakresie transakcji, integralności referencyjnej i wyższej współbieżności.
Każda tabela MyISAM odpowiada trzema plikom na dysku twardym. Wszystkie trzy pliki mają tę samą nazwę pliku, ale różne rozszerzenia wskazujące ich przeznaczenie typu: plik .frm zawiera definicję tabeli, ale ten plik nie jest częścią silnika MyISAM, lecz serwera; .MYD przechowuje dane tabeli; .MYI to plik indeksowy tabeli.

Czym jest InnoDB?

InnoDB to kolejny silnik pamięci masowej dla MySQL, a nowa wersja standardu wydana przez MySQL AB jest zawarta we wszystkich pakietach instalacyjnych binarnych.Od 5.5 jako domyślny silnik pamięci masowej。 Jego zaletą nad innymi silnikami pamięci masowej jest wsparcie dla transakcji zgodnych z ACID (podobnie jak PostgreSQL) oraz integralność parametrów (czyli wsparcie dla kluczy obcych).

Oracle Corporation przejęła Innobase w październiku 2005 roku. Innobase wykorzystuje autoryzację podwójnej autoryzacji. Jest dystrybuowany za pomocą GNU i umożliwia także innym grupom, które chcą włączyć InnoDB do komercyjnego oprogramowania, uzyskanie licencji.

Najpopularniejszymi silnikami pamięci masowej są MyISAM i InnoDB. Główne różnice między MyISAM a InnoDB to wydajność i kontrola transakcji. MyISAM to rozszerzona implementacja wczesnego ISAM (Indexed Sequential Access Method, ISAM nie jest już wspierany po MySQL 5.0), ISAM został zaprojektowany do radzenia sobie z sytuacjami, gdy częstotliwość odczytu jest znacznie wyższa niż częstotliwość zapisu, więc ISAM, a później MyISAM, nie uwzględniają wsparcia różnych rzeczy, wykluczają TPM, nie potrzebują rekordów transakcji, efektywność zapytań ISAM jest znaczna, a zużycie pamięci bardzo małe.
MyISAM dziedziczy te zalety, nadążając za współczesnością i wieloma przydatnymi nowymi funkcjami i powiązanymi narzędziami. Na przykład, biorąc pod uwagę kontrolę współbieżności, zapewnione są blokady na poziomie tabeli, a chociaż sam MyISAM nie obsługuje odporności na błędy, może być używany do odzyskiwania po awariach przez myisamchk. A ponieważ MyISAM używa własnych niezależnych plików pamięci (plik danych MYD i indeks MYI) dla każdej tabeli, jest bardzo wygodny do tworzenia kopii zapasowych i przywracania (wystarczające jest nadpisanie kopii), a także obsługuje odzyskiwanie online. W porównaniu z innymi silnikami pamięci masowej, MyISAM ma większość narzędzi do sprawdzania i naprawy tabel. Tabele MyISAM można kompresować i obsługują wyszukiwanie pełnotekstowe. Nie są bezpieczne dla transakcji i nie obsługują kluczy obcych, więc jeśli Twoja aplikacja nie wymaga transakcji i obsługuje tylko podstawowe operacje CRUD, to MyISAM jest najlepszym wyborem.
InnoDB został zaprojektowany do sytuacji odczytu i zapisu o wysokiej równocześności, wykorzystując MVCC (Multi-Version Concurrency Control) oraz blokady na poziomie wiersza, aby zapewnić wsparcie dla transakcji zgodnych z ACID. InnoDB obsługuje integralność referencji kluczy obcych i posiada możliwości odzyskiwania błędów. Dodatkowo wydajność InnoDB jest w oficjalnych kategoriach całkiem dobra, zwłaszcza przy przetwarzaniu dużych ilości danych: wydajność CPU InnoDB jest nieporównywalna z innymi silnikami pamięci danych relacyjnych opartych na dyskach. Jednak kopie zapasowe i odzyskiwanie w InnoDB są nieco bardziej uciążliwe, chyba że korzystasz z wsparcia dla przestrzeni tabel Mulit, które zapewnia wersja 4.1 lub nowsza, ponieważ w przeciwieństwie do MyISAM, pliki danych InnoDB nie odpowiadają każdej tabeli osobno. Zamiast tego używa się współdzielonej przestrzeni tabelowej, a prosta metoda nadpisywania kopii nie jest dla niego odpowiednia, a dane muszą zostać przywrócone po zakończeniu MYSQL. Używając przestrzeni tabelowej dla każdej tabeli, każda tabela odpowiada osobnemu plikowi przestrzeni tabelowej, sytuacja jest znacznie prostsza. Ma takie same cechy jak typy BDB i obsługuje także klucze obce. Tabele InnoDB są szybkie i mają bogatsze funkcje niż BDB, dlatego zaleca się, jeśli potrzebujesz silnika pamięci transakcyjnie bezpiecznej.

Ogólnie rzecz biorąc, InnoDB jest dobrym wyborem, jeśli potrzebne jest wsparcie dla transakcji, i charakteryzuje się wysoką częstotliwością jednoczesnego odczytu i zapisu. BDB można rozważać, jeśli częstotliwość jednoczesnych odczytów i zapisów nie jest wysoka, ale BDB nie będzie już wspierany w wersjach MySQL 5.1 i nowszych. Ta opcja zniknęła

Domyślnie transakcje w InnoDB są otwarte (ustaw autocommit = 0), co oznacza, że za każdym razem, gdy wstawiany jest rekord, tabela InnoDB traktuje ją jako osobną transakcję. Jeśli wstawimy 10 000 rekordów i nie zamkniemy transakcji, tabela typu InnoDB potraktuje ją jako 10 000 transakcji, a całkowity czas wstawiania w tym momencie jest duży; w tym momencie musimy najpierw wyłączyć transakcję, a potem ją wstawić, więc prędkość będzie bardzo szybka. Jeśli chodzi o kopce i BDB (Berkeley DB), relatywnie mówiąc, wskaźnik penetracji nie jest tak dobry jak w poprzednich dwóch, ale w niektórych przypadkach, Silnik pamięci masowej Heap jest nadal bardzo przydatny, przechowuje dane w pamięci i jest niezwykle szybki, ponieważ nie ma czekającego na dysk I/O. Ale ponieważ jest to silnik pamięci masowej, wszelkie modyfikacje znikną po restarcie serwera. Heap to świetne miejsce do testowania BDB, ponieważ jest to pierwszy transakcyjnie bezpieczny silnik magazynowy MySQL. Zbudowany na bazie biblioteki bazy danych Berkeley DB, jest również bezpieczny transakcyjnie, ale BDB oczywiście nie jest tak popularny jak InnoDB, ponieważ większość silników pamięci masowej w MySQL obsługujących transakcje również poszukuje MVCC lub silników pamięci masowej na poziomie wierszowym, podczas gdy BDB obsługuje tylko blokadę na poziomie strony.

Silnik InnoDB

InnoDB to silnik pamięci transakcyjnej, który obsługuje rollbacki i został zaprojektowany tak, aby zapewniać usługi wysokiej wydajności przy przetwarzaniu dużych ilości danych, a także tworzy pule buforowe w pamięci podczas działania do buforowania danych i indeksów.

Zalety silnika InnoDB:

1. Wspierać przetwarzanie transakcji i funkcje transakcyjne ACID;

2. Realizowane są cztery poziomy izolacji standardu SQL;

3. Wspierać ograniczenia zamków na poziomie wiersza i kluczy obcych;

4. Możesz używać logów transakcyjnych do odzyskiwania danych.

5. Poziom blokady to blokada wierszowa, odpowiednia do częstych modyfikacji tabeli przy wysokiej równobieżności, a wysoka równocześność jest lepsza niż MyISAM. Minusem jest duże zużycie systemu.

6. Indeks nie tylko sam się buforuje, ale także zapamiętuje dane, co wymaga więcej pamięci niż MyISAM.

Wady silnika InnoDB:

Ponieważ nie zapisuje liczby wierszy w tabeli, cała tabela jest skanowana przy użyciu statystyk COUNT.

Silnik MyISAM

MyISAM jest domyślnym silnikiem przed MySQL 5.5.5 i został zaprojektowany do szybkiego odczytu.

Zalety silnika MyISAM:

1. Wysokowydajne czytanie;

2. Ponieważ zapisuje liczbę wierszy w tabeli, cała tabela nie będzie skanowana przy użyciu statystyk COUNT;

Wady silnika MyISAM:

1. Poziom zamka jest zamkiem stołowym, a zaletą zamka zegarkowego jest niewielka wysokość nad głową i szybka blokada; Wady to duża granularność blokady, wysokie prawdopodobieństwo impulsu blokady oraz niska pojemność współbieżności, co jest odpowiednie dla usług opartych na zapytaniach.

2. Ten silnik nie obsługuje transakcji ani kluczy obcych.

3. Operacje INSERT i UPDATE muszą zablokować całą tabelę;

4. Przechowuje liczbę wierszy w tabeli, więc gdy SELECT COUNT(*) FROM TABLE, wystarczy bezpośrednio odczytać zapisane wartości, bez konieczności skanowania całej tabeli.

Dostępne scenariusze

MyISAM nadaje się do: (1) wykonywania wielu obliczeń liczących; (2) Rzadkie wstawianie i bardzo częste zapytania; (3) Nie ma żadnego biznesu.

InnoDB nadaje się do: (1) wysokich wymagań dotyczących niezawodności lub transakcji; (2) Aktualizacje tabel i zapytania są dość częste, a ryzyko zablokowania tabeli jest stosunkowo wysokie.

Porównanie tabel

WłaściwościMyISAMStertaBDBInnoDB
TransakcjeBrak poparciaBrak poparciaW akwariumW akwarium
Ziarnistość blokadyZamek stołowyZamek stołowyBlokada strony (strona, 8KB)Śluza
składowaniePliki podzieloneW pamięciJeden plik na tabelęPrzestrzeń stołowa
Poziom izolacjinienieCzytaj zobowiązaneWszyscy
Format przenośnybyćNie maniebyć
Zupełność cytowańnienieniebyć
Klucz podstawowy danychnieniebyćbyć
MySQL buforuje rekordy danychnieTakTakTak
UżytecznośćPełna wersjaPełna wersjaMySQL-MaxPełna wersja


Pewne różnice w szczegółach


1. InnoDB nie obsługuje indeksów typu FULLTEXT, które są obsługiwane od MySQL 5.6 (eksperymentalnego).

2. InnoDB nie zapisuje konkretnej liczby wierszy tabeli, to znaczy, podczas wykonywania select count() z tabeli InnoDB musi przeskanować całą tabelę, aby obliczyć, ile wierszy się znajduje, ale MyISAM musi jedynie odczytać liczbę zapisanych wierszy. Zauważ, że gdy instrukcja count() zawiera warunek gdzie, operacja jest taka sama dla obu tabel.

3. Dla pól AUTO_INCREMENT typu InnoDB musi zawierać indeks zawierający tylko to pole, ale w tabeli MyISAM możesz utworzyć wspólny indeks z innymi polami.

4. Gdy DELETE FROM table, InnoDB nie odtwarza tabeli, lecz usuwa ją linia po linii.

5. Operacja LOAD TABLE FROM MASTER nie działa dla InnoDB, rozwiązaniem jest najpierw zmiana tabeli InnoDB na tabelę MyISAM, import danych, a następnie zmiana na tabelę InnoDB, ale nie dotyczy tabeli wykorzystującej dodatkowe funkcje InnoDB (np. klucze obce).

6. Dodatkowo, blokada wiersza tabeli InnoDB nie jest absolutna; jeśli MySQL nie może określić zakresu do przejścia podczas wykonywania instrukcji SQL, tabela InnoDB również zablokuje całą tabelę.

7. InnoDB nie obsługuje indeksowania pełnego tekstu, podczas gdy MyISAM tak. Indeksowanie pełnego tekstu odnosi się do tworzenia indeksu odwrotnej kolejności każdego słowa w char, varchar i tekst (z wyjątkiem słów zatrzymanych). Indeks pełnych tekstów MyISAM jest w rzeczywistości bezużyteczny, ponieważ nie obsługuje segmentacji słów chińskich i musi być zapisywany do tabeli danych przez użytkownika po segmentacji słów, a słowa o liczbie mniej niż 4 chińskie znaki będą ignorowane jak stop.





Poprzedni:Zgromadzenie pytań eksperymentalnych
Następny:SQL statement to Varchar type
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com