Jak MyISAM może być „szybszy” niż InnoDB, jeśli
- MyISAM musi dokonać odczytu dysku dla danych?
- InnoDB używa puli buforów do indeksów i danych, a MyISAM tylko do indeksu?
mysql
innodb
myisam
storage-engine
jcho360
źródło
źródło
Odpowiedzi:
Jedynym sposobem, w jaki MyISAM może być szybszy niż InnoDB, byłby w tych wyjątkowych okolicznościach
MyISAM
Podczas czytania, indeksy stole MyISAM można przeczytać raz z pliku .myi i ładowane w MyISAM Key Cache (jak sortowano key_buffer_size ). Jak można szybciej czytać tabelę MyISAM .MYD? Z tym:
Pisałem o tym w moich poprzednich postach
InnoDB
OK, a co z InnoDB? Czy InnoDB wykonuje jakieś dyskowe operacje wejścia / wyjścia dla zapytań? Zaskakujące, że tak !! Prawdopodobnie myślisz, że jestem szalony, że to mówię, ale to absolutna prawda, nawet w przypadku zapytań SELECT . W tym momencie prawdopodobnie zastanawiasz się: „Jak, na świecie, InnoDB robi dyskowe operacje we / wy dla zapytań?”
Wszystko to wraca do tego, że InnoDB jest silnikiem transakcyjnym do przechowywania danych na podstawie ACID . Aby InnoDB bycia transakcyjna, to musi wspierać
I
inACID
, który jest izolacja. Technika utrzymywania izolacji dla transakcji odbywa się za pośrednictwem MVCC, Multiversion Concurrency Control . Mówiąc najprościej, InnoDB rejestruje wygląd danych przed próbą ich zmiany przez transakcje. Gdzie to się rejestruje? W systemowym pliku obszaru tabel, lepiej znanym jako ibdata1. To wymaga dysku I / O .PORÓWNANIE
Ponieważ zarówno InnoDB, jak i MyISAM robią dyskowe operacje we / wy, jakie losowe czynniki decydują o tym, kto jest szybszy?
DELETEs
iUPDATEs
W związku z tym w środowisku o wysokim stopniu odczytu tabela MyISAM ze stałym formatem wiersza może przewyższać odczyt InnoDB z puli buforów InnoDB, jeśli w dziennikach cofania zawartych w ibdata1 zapisywana jest wystarczająca ilość danych do obsługi zachowania transakcyjnego nałożone na dane InnoDB.
WNIOSEK
Zaplanuj dokładnie typy danych, zapytania i silnik pamięci masowej. Gdy dane rosną, przenoszenie danych może być bardzo trudne. Zapytaj Facebooka ...
źródło
W prostym świecie MyISAM jest szybszy do odczytu, a InnoDB do szybszego zapisu.
Gdy zaczniesz wprowadzać mieszane operacje odczytu / zapisu, InnoDB będzie również szybsze w przypadku odczytu, dzięki mechanizmowi blokowania wierszy.
Kilka lat temu napisałem porównanie silników pamięci masowej MySQL , które do dziś są prawdziwe, przedstawiając wyjątkowe różnice między MyISAM a InnoDB.
Z mojego doświadczenia wynika, że powinieneś używać InnoDB do wszystkiego oprócz tabel obciążających pamięć podręczną, w których utrata danych z powodu uszkodzenia nie jest tak istotna.
źródło
Aby dodać tutaj odpowiedzi na różnice mechaniczne między dwoma silnikami, przedstawiam empiryczne badanie porównania prędkości.
Jeśli chodzi o czystą prędkość, nie zawsze jest tak, że MyISAM jest szybszy niż InnoDB, ale z mojego doświadczenia wynika, że jest on szybszy w środowiskach roboczych PURE READ około 2,0-2,5 razy. Oczywiście nie jest to odpowiednie dla wszystkich środowisk - jak napisali inni, MyISAM nie ma takich transakcji, jak klucze obce.
Poniżej przeprowadziłem trochę testów porównawczych - użyłem Pythona do zapętlenia i biblioteki timeit do porównań czasowych. Dla zainteresowania załączyłem również silnik pamięci, który zapewnia najlepszą wydajność na całej płycie, chociaż jest odpowiedni tylko dla mniejszych tabel (ciągle napotykasz,
The table 'tbl' is full
gdy przekroczysz limit pamięci MySQL). Cztery typy wybranych, na które patrzę, to:Po pierwsze, utworzyłem trzy tabele, używając następującego SQL
z „MyISAM” zamienionym na „InnoDB” i „memory” w drugiej i trzeciej tabeli.
1) Wanilia wybiera
Pytanie:
SELECT * FROM tbl WHERE index_col = xx
Wynik: remis
Ich szybkość jest zasadniczo taka sama i zgodnie z oczekiwaniami jest liniowa w liczbie kolumn do wyboru. InnoDB wydaje się nieco szybszy niż MyISAM, ale jest to naprawdę marginalne.
Kod:
2) Liczy się
Pytanie:
SELECT count(*) FROM tbl
Wynik: MyISAM wygrywa
Ten pokazuje dużą różnicę między MyISAM a InnoDB - MyISAM (i pamięć) śledzi liczbę rekordów w tabeli, więc transakcja jest szybka i O (1). Ilość czasu potrzebna do zliczenia InnoDB wzrasta super-liniowo wraz z rozmiarem stołu w badanym zakresie. Podejrzewam, że wiele przyspieszeń z zapytań MyISAM, które są obserwowane w praktyce, wynika z podobnych efektów.
Kod:
3) Wybór warunkowy
Pytanie:
SELECT * FROM tbl WHERE value1<0.5 AND value2<0.5 AND value3<0.5 AND value4<0.5
Wynik: MyISAM wygrywa
Tutaj MyISAM i pamięć działają mniej więcej tak samo i pokonały InnoDB o około 50% w przypadku większych tabel. Jest to rodzaj zapytania, dla którego korzyści MyISAM wydają się zmaksymalizowane.
Kod:
4) Podselekcja
Wynik: InnoDB wygrywa
Dla tego zapytania utworzyłem dodatkowy zestaw tabel dla podselekcji. Każda z nich to po prostu dwie kolumny BIGINT, jedna z indeksem klucza podstawowego i jedna bez indeksu. Ze względu na duży rozmiar stołu nie testowałem silnika pamięci. Poleceniem tworzenia tabeli SQL było
gdzie ponownie „MyISAM” zastępuje się „InnoDB” w drugiej tabeli.
W tym zapytaniu zostawiam rozmiar tabeli wyboru na 1000000 i zamiast tego zmieniam rozmiar subselekcji kolumn.
Tutaj InnoDB wygrywa łatwo. Po przejściu do rozsądnej tabeli rozmiarów oba silniki skalują się liniowo z rozmiarem podselekcji. Indeks przyspiesza polecenie MyISAM, ale co ciekawe, ma niewielki wpływ na szybkość InnoDB. subSelect.png
Kod:
Myślę, że przesłaniem tego wszystkiego jest to, że jeśli naprawdę martwisz się szybkością, musisz przeprowadzić analizę porównawczą zapytań, a nie założyć, który silnik będzie bardziej odpowiedni.
źródło
SELECT * FROM tbl WHERE index_col = xx
- Oto dwa czynniki, które mogą prowadzić do większej zmienności na wykresie: Klucz główny vs. klucz pomocniczy; indeks jest buforowany vs nie.SELECT COUNT(*)
jest wyraźnym zwycięzcą dla MyISAM, dopóki nie dodaszWHERE
klauzuli.Który jest szybszy? Albo może być szybszy. YMMV.
Którego powinieneś użyć? InnoDB - odporny na awarie itp.
źródło