Niedawno odkryłem, że MySQL ma silnik „pamięci”, o którym nie wiedziałem (większość mojej pracy z bazami danych dotyczy projektów hobbystycznych, więc uczę się tego, czego potrzebuję). Wygląda na to, że ta opcja powinna dać mi znacznie lepszą wydajność, więc zastanawiam się, czy są jakieś wady z tym związane. Dwa, które znam to:
- Potrzebuję wystarczającej ilości pamięci RAM, aby pomieścić dane stoliki.
- Tabele zostaną utracone, jeśli urządzenie się wyłączy.
Uważam, że nr 1 nie powinien stanowić problemu, ponieważ używam AWS EC2 i mogę w razie potrzeby przejść do typu instancji z większą pamięcią. Myślę, że mogę złagodzić # 2, w razie potrzeby zrzucając z powrotem na dysk.
Jakie są inne problemy? Czy silnik pamięci może kiedykolwiek dać gorszą wydajność niż MyISAM lub InnoDB? Myślę, że czytam coś, co różni się indeksami w tym silniku; czy muszę się tym martwić?
źródło
Istnieje wiele przypadków, w których nie należy używać silnika pamięci - i kiedy InnoDB będzie szybszy. Musisz tylko pomyśleć o współbieżności, a nie trywialnych testach jednowątkowych.
Jeśli masz wystarczająco dużą pulę buforów, InnoDB stanie się również rezydentem pamięci dla operacji odczytu. Bazy danych mają pamięci podręczne . Rozgrzewają się!
Ponadto - nie lekceważ wartości blokowania na poziomie wiersza i MVCC (czytniki nie blokują programów zapisujących ). Może być „wolniejszy”, gdy zapis musi trwać na dysku. Ale przynajmniej nie będziesz blokował podczas tej operacji zapisu, tak jakbyś był na tablicy pamięci (bez MVCC; blokowanie na poziomie tabeli).
źródło
Dla przypomnienia. Testowałem tabele MySQL w pamięci, aby przechowywać pewne informacje. I przetestowałem APC (APCu) PHP pod kątem przechowywania tych samych informacji.
Dla 58000 rejestrów. (varchar + liczba całkowita + data).
Tabela ma tylko jeden indeks, więc nie sądzę, że jest to główny czynnik.
Wniosek:
Tabela pamięci nie jest opcją dla „dużych” tabel, ponieważ zużywa zbyt dużo pamięci.
źródło
"MEMORY tables use a fixed-length row-storage format. Variable-length types such as VARCHAR are stored using a fixed length."
dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html Skutecznie wydaje się, że VARCHAR staje się CHAR dzięki silnikowi MEMORY.Inną wadą tabel opartych na MEMORY jest to, że nie można ich wielokrotnie odwoływać w tym samym zapytaniu. Przynajmniej takie zachowanie znaleziono do wersji 5.4. Jak w przypadku CTE (od wersji 8.x) nie ma potrzeby używania tabel pośrednich opartych na memie w przypadku skomplikowanych procedur.
źródło
Według instrukcji MySQL i MariaDB BLOB i CLOB (różne typy TEKSTÓW) nie są obsługiwane przez pamięć MEMORY. Dla naszych własnych celów uczyniło to silnik pamięci MEMORY prawie bezużytecznym.
http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html
https://mariadb.com/kb/en/mariadb/memory-storage-engine/
Próbując przekonwertować tylko część bazy danych na pamięć MEMORY, stwierdziłem, że klucze obce silnika między pamięcią masową nie są obsługiwane. Tak więc wszystkie tabele, które powinny zawierać odwołania do kluczy obcych do tabel zawierających BLOB / CLOB, powinny również znajdować się w typach pamięci innych niż pamięć (przynajmniej wpływa to na tabele podrzędne InnoDB).
źródło
Tabele MEMORY nie są przeznaczone do trwałego przechowywania, w szczególności dużych podzbiorów danych lub czegokolwiek, w którym zachowanie jest krytyczne. Z mojego doświadczenia ich najlepszym celem jest przechowywanie przejściowych rekordów podczas tworzenia i wypełniania tabel tymczasowych podczas złożonych procedur, które działają znacznie szybciej niż większość innych typów tabel do tego celu, pod warunkiem, że próg bufora kluczowego dla silnika jest wystarczająco wysoki, aby nie ponieść zapis na dysku. W tym celu może to działać o rząd wielkości szybciej niż MyISAM lub InnoDB, ponieważ nie ma dyskowego wejścia / wyjścia, aw przypadku tabeli, która jest zawarta w określonej procedurze, indeksowanie i relacje nie mają tak dużego znaczenia, jak byłoby tam, gdzie oczekuje się wytrwałości.
źródło
Oprócz poprzednich odpowiedzi. prosto z podręcznika MySQL 5.7:
„Wydajność PAMIĘCI jest ograniczona rywalizacją wynikającą z wykonywania jednowątkowego i narzutu blokady tabeli podczas przetwarzania aktualizacji. Ogranicza to skalowalność, gdy zwiększa się obciążenie, szczególnie w przypadku zestawień instrukcji zawierających zapisy”.
... i to jest bardzo realne ograniczenie. Na przykład: gdy masz wiele sesji próbujących stworzyć ładne, szybkie tabele tymczasowe MEMORY, jednowątkowe może powodować poważne wąskie gardło wydajności.
źródło