2012-05-21 13 views
34

Zauważyłem, że mój serwer bazy danych obsługuje silnik bazy danych pamięci. Chcę, aby baza danych, którą już uruchomiłem, uruchomiła całkowicie InnoDB w pamięci dla wydajności.Jak sprawić, aby baza danych MySQL działała całkowicie w pamięci?

Jak to zrobić? Zbadałem PHPMyAdmin i nie mogę znaleźć funkcji "zmień silnik".

+3

Powinieneś najpierw zrozumieć, co tam robisz. Korzystanie z silnika pamięci ma pewne konsekwencje. – usr

+2

działające w pamięci oznacza, że ​​dane są wymazywane, gdy tylko ponownie uruchomisz demona MySQL (lub zawiesi się), lepiej byłoby grać z query_cache dla MySQL lub memcached dla buforowania wyników – Mikey

+1

Nie jestem pewien, czy to jest to, chcesz. Jaki jest dokładnie twój problem z wydajnością? – Mario

Odpowiedz

18

Zakładając, że rozumiesz konsekwencje użycia silnika MEMORY, o którym mowa w komentarzach, i here, a także kilka innych znajdziesz, przeszukując (brak bezpieczeństwa transakcji, problemy z blokowaniem itp.) - możesz postępować w następujący sposób: :

Tabele MEMORY są przechowywane inaczej niż InnoDB, więc musisz użyć strategii eksportu/importu. Najpierw zrzuty każdej tabeli osobno do pliku przy użyciu SELECT * FROM tablename INTO OUTFILE 'table_filename'. Utwórz bazę danych MEMORY i utwórz ponownie tabele, których będziesz używać z tą składnią: CREATE TABLE tablename (...) ENGINE = MEMORY;. Następnie można zaimportować dane za pomocą LOAD DATA INFILE 'table_filename' INTO TABLE tablename dla każdej tabeli.

+0

Czy osoba, która zgłosiła chęć komentowania? – PinnyM

+29

Nigdzie to nie mówi, jak utworzyć bazę danych lub tabelę pamięci. –

+8

Do punktu wykonanego przez @INTPnerd, podczas odtwarzania tabel, użyj składni: 'CREATE TABLE someTable (...) ENGINE = MEMORY;' – PinnyM

5

Jeśli twoja baza danych jest wystarczająco mała (lub jeśli dodasz wystarczającą ilość pamięci), twoja baza danych będzie działać skutecznie w pamięci, ponieważ twoje dane zostaną zbuforowane po pierwszym żądaniu.

Zmiana definicji tabel bazy danych w celu użycia silnika pamięci jest prawdopodobnie bardziej skomplikowana, niż jest to potrzebne.

Jeśli masz wystarczająco dużo pamięci, aby załadować tabele do pamięci za pomocą silnika MEMORY, masz wystarczająco dużo, aby dostroić ustawienia innodb tak, aby cache wszystko i tak.

9

Silnik pamięci nie jest rozwiązaniem, którego szukasz. Najpierw tracisz wszystko, co trafiłeś do bazy danych (np. ACID).

Oto niektóre lepsze alternatywy:

  1. Nie używać łączy - bardzo niewiele dużych aplikacji to zrobić (czyli Google, Flickr, Netflix), bo to jest do bani dla dużych zestawów łączy.
  2. Upewnij się, że kolumny, z którymi chcesz wysyłać zapytania, mają indeksy. Użyj EXPLAIN, aby potwierdzić, że są używane.
  3. Użyj i zwiększ swój Query_Cache i miejsce w pamięci dla indeksów, aby uzyskać je w pamięci i przechowywać częste wyszukiwania.
  4. Denormalizuj swój schemat, szczególnie w przypadku prostych połączeń (np. Pobierz fooId z barMap).

Ostatni punkt to klucz. Uwielbiałem łączenia, ale potem musiałem uruchamiać sprzężenia na kilku stołach z 100 milionami wierszy. Nie dobrze. Lepiej wstawiaj dane, do których się przyłączysz, do tej tabeli docelowej (jeśli to nie za dużo) i zapytaj o indeksowane kolumny, a otrzymasz zapytanie w kilka sekund.

Mam nadzieję, że ta pomoc.

+9

Ten ostatni punkt może być świetny dla wydajności, ale może być zabójcą dla spójności danych i konserwacji, jeśli nie jest używany prawidłowo. Aktualizacje wyzwalacza lub podobne strategie replikacji pamięci podręcznej mogą w tym pomóc, ale sposób buforowania denormalizowanych danych nie powinien być brany za pewnik ... – PinnyM

+3

@PinnyM dobry punkt. Tutaj trzeba zdecydować, co jest najważniejsze. RDBMS są świetne dla atomowości i spójności, ale nie dla skalowania i wydajności, zwłaszcza przy łączeniach. 6NF (Star Schema) jest bardzo normalny, ale dołącz szczęśliwe. Nadal można zachować dane w niektórych tabelach w znormalizowany sposób i używać wyzwalaczy i zaplanowanych zadań do aktualizacji denormalizowanych (tylko do odczytu) tabel ze znormalizowanych tabel (odczyt/zapis). –

+1

1 i 4 są najgorszą radą w historii. – Darwin

4

„Jak mam to zrobić? I zbadane PHPMyAdmin, i nie mogę znaleźć "zmiana silnika" funkcjonalność."

W bezpośredniej odpowiedzi na tę część pytania, można wydać ALTER TABLE tbl engine=InnoDB; i będzie ona ponownie do stołu w odpowiednim silnikiem.

12

Możliwe jest również umieszczenie danych MySQL katalog w sposób tmpfs w tym samym przyspieszenie zapisu bazy danych i odczytanych połączeń. może nie jest to najbardziej skuteczny sposób to zrobić, ale czasami nie można po prostu zmienić silnik przechowywania.

Oto mój wpis fstab na przetwarzanie moich danych MySQL katalog

none   /opt/mysql/server-5.6/data tmpfs defaults,size=1000M,uid=999,gid=1000,mode=0700   0  0 

Napisałem również post wyjaśniający szczegóły konfiguracji. Używam tej konfiguracji do testów bazy danych.

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

Można też spojrzeć na innodb_flush_log_at_trx_commit = 2 ustawienia. Może to wystarczająco przyspieszy twój MySQL.

innodb_flush_log_at_trx_commit zmienia zachowanie koloru dysku mysql. Po ustawieniu na 2 będzie wypróżniać bufor co sekundę. Domyślnie każda wkładka spowoduje spłukiwanie i tym samym spowoduje większe obciążenie IO.

+0

Możesz również rzucić okiem na libeatmydata. Zapobiega fsync i starszych połączeń synchronizacji, a tym samym przyspieszyć aplikację. https://www.flamingspork.com/projects/libeatmydata/ (apt-get install eatmydata; eatmydata /etc/init.d/mysql restart) – Jotschi

+0

Zastanawiam mieć całą mysql w pamięci i innym instancja mysql do replikowania i utrwalania danych. Oczywiście, zakładając, że mogę poradzić sobie z ryzykiem luźnych danych z powodu opóźnienia replikacji. –

Powiązane problemy