Baza danych Drupal innodb czy MyISAM?

10

Mam witrynę Drupal i mam problemy z wydajnością. Znalazłem Jak przekonwertować bazę danych z MyISAM do InnoDB? wskazując, że wydajność może się poprawić przez przełączanie.

Jak mogę sprawdzić, czy moja baza danych MySQL to InnoDB lub MyISAM?

chrisjlee
źródło
1
Typ tabeli nie jest powiązany z katalogiem. Możesz mieć katalog zawierający mieszankę tabel MyISAM i InnoDB.
mpdonadio
2
Chociaż optymalizacje na tym poziomie są korzystne, bardzo wątpię, że zmiana typów tabel naprawi problemy z wydajnością. Różnica po prostu nie jest tak duża.
Letharion
1
@ Chris J. Lee, to prawda. Mieszanie typów tabel można wykorzystać ze względu na wydajność lub do wykorzystania funkcji dostępnych tylko dla określonego typu tabeli (np. Wyszukiwanie FULLTEXT w tabelach MyISAM). Może się to również zdarzyć przypadkowo, jeśli zmienisz domyślne ustawienia mysqld i utworzysz więcej tabel w katalogu :)
mpdonadio
2
Letharion: to po prostu niepoprawne. Typy tabel i sposób ich konfigurowania mysql mają ogromny wpływ na wydajność!
Walter Heck,
2
@Letharion: W rzeczywistości, pomijając ulepszenia architektoniczne, bardzo duży wzrost wydajności w przypadku takich rzeczy jak współbieżność z mieszanymi SELECT i UPDATE - UPDATE zablokuje tabelę w MyISAM, ale tylko wiersz w InnoDB - oznacza, że ​​ogromny wzrost wydajności może być widocznym z niczym innym jak zmianą silnika stołu. Teraz, jeśli robisz głupie zapytanie, to robisz głupie zapytanie, a zmiana typów tabel nie pomoże. Ale odrzucenie wymiany silników z ręki jest równie niepoprawne.
BMDan

Odpowiedzi:

8

Możesz uruchomić niestandardowe zapytanie:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

aby wyświetlić listę wszystkich tabel w bazie danych i wyszukiwarki, która jest używana dla każdej z nich.

Alternatywnie możesz zalogować się do bazy danych za pomocą phpMyAdmin i wybrać bazę danych ... silnik zobaczysz w Typekolumnie na liście tabel.

Osobiście polecam Navicat dla MySQL , jest to bardzo przyjemny GUI MySQL i sprawia, że ​​znalezienie takich rzeczy jest bardzo łatwe.

Źródło: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
źródło
Stare narzędzie MySQL Administrator działa również dobrze w takich przypadkach. Jeśli grzebiesz w witrynie MySQL, nadal możesz znaleźć instalatora.
mpdonadio
@MPD Wow, czy to nadal trwa? Musisz go pobrać, choćby dla odrobiny nostalgii :)
Clive
Administrator i przeglądarka zapytań są teraz oficjalnie przestarzałe i nie są obsługiwane, ale nadal możesz je pobrać. Nienawidzę Workbench i nadal z nich korzystam.
mpdonadio
Aby zobaczyć wynik podobny do tego, co zobaczyłeś w phpMyAdmin w wierszu poleceń, użyj SHOW TABLE STATUS. Aby uzyskać prostą liczbę tabel w każdym typie silnika, wystarczy SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
6

Moim najlepszym doświadczeniem było decydowanie na podstawie stołu. InnoDB jest fajny, ponieważ może uniknąć blokowania tabeli (żaden inny proces nie może odczytać z tabeli, gdy jeden proces pisze), ale działa strasznie z COUNT (), który jest często używany do zapytań pager.

(Edycja: patrz komentarz Clives poniżej)

Wpływają również na konfigurację MySQL, w zależności od używanego DB. Jeśli masz dostęp do serwera, mysqltuner powinien być pierwszym krokiem do sprawdzenia konfiguracji:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Jaskółka oknówka
źródło
2
+1 Nie wiedziałem InnoDB była powolna dla COUNTzapytań, zgodnie z tym artykułem przez byłego kierownika grupy High Performance dla MySQL choć tylko naprawdę wpływa kwerendę zawierającą COUNT(*) bez pomocą WHEREklauzuli.
Clive
3
Powodem jest to, że MyISAM utrzymuje wartość dla tabeli dla liczby wierszy w tabeli, co oznacza, że ​​prosty SELECT COUNT(*) FROM tablemoże natychmiast zwrócić tę wartość. InnoDB nie, więc musi przeskanować cały indeks klucza podstawowego. To powiedziawszy, podczas gdy Drupal robi dużo SELECT COUNT(*), mogę myśleć tylko o jednym miejscu w całym kodzie, który robi to bez WHEREklauzuli. Dlatego nie używaj MyISAM z troski o ten konkretny przypadek. InnoDB z przyzwoitą pulą buforów będzie szybszy dla wszystkich zapytań w świecie rzeczywistym.
BMDan
6

Próba szybszego uzyskania strony internetowej jest jak ślepa zmiana samochodu i mam nadzieję, że dostaniesz szybszy następnym razem.

Najpierw spróbuj nisko wiszących owoców, jeśli to nie pomoże, spróbuj znaleźć prawdziwe wąskie gardło.

  1. Czy włączyłeś wbudowane mechanizmy: buforowanie stron (skuteczne tylko dla anonimowych użytkowników), agregację CSS i JS?
  2. Jeśli Twój host oferuje pamięć podręczną kodów operacyjnych, taką jak APC, włącz ją.
  3. Skonfiguruj lokalnie Drupala, w tym pełną bazę danych.
  4. Upewnij się, że masz XDebug uruchomiony.
  5. Zacznij profilować rzeczywistą wydajność. W ten sposób możesz określić, która część witryny zajmuje dużo czasu. Im wolniejsza witryna, tym łatwiej znaleźć winny kod / komponent.

Często jest to tylko powolne zapytanie DB, które wymaga indeksu lub modułu wykonującego czynności w zwolnionym tempie.

Odkryłem również duże różnice między hostami. Jeśli zainstalujesz świeżego drupala po wyjęciu z pudełka, czy wydajność jest w porządku? Jeśli nie, czas poszukać innego hostera.

BetaRide
źródło
5

FWIW nasz prawie 20-węzłowy węzeł Drupal 6.x miał pewne problemy z wydajnością i zdecydowałem się przenieść wszystkie tabele do InnoDB. To było łatwe, a sposób, w jaki sobie z tym poradziłem, to użycie mysqldump do zrzucenia całej zawartości do pliku sql, użycie edytora (sed) do zastąpienia wszystkich wystąpień MyISAM do InnoDB, a następnie przeładowanie bazy danych z tego pliku. Jedną z wad jest to, że nie można odzyskać miejsca z bazy danych InnoDB (IIRC), ale dopóki przechowujesz zduplikowane tabele w oddzielnej bazie danych, nie powinieneś mieć problemów. Aha, i zauważyliśmy znaczny wzrost wydajności. A ponieważ mamy cztery instancje Drupala, sama liczba plików tabel została wyeliminowana z systemu plików (tak, są one zawarte w samym pliku InnoDB). To jest moja wartość .02 $.

bobmct
źródło
2
Posiadanie pojedynczego obszaru tabel InnoDB może zaoszczędzić i-węzły, ale (jak sam o tym wspominasz) kosztem miejsca na dysku. Nawet jeśli usuniesz dużo danych, nie będziesz w stanie odzyskać tego miejsca na dysku. Powoduje to również niepotrzebne duże pliki kopii zapasowych i brak możliwości przywracania pojedynczych tabel. Dlatego wolę korzystać z tej innodb_file_per_tableopcji.
geewiz
1
Ponadto, można przekonwertować tabele na miejscu: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Dodaj odpowiednie opcje ( -uroot -psomepassna przykład) do dwóch mysqls, jeśli to konieczne.
BMDan
5

Tylko jedna głowa do góry. Jeśli korzystasz z Drupal 6, możesz zainstalować moduł DBTuner ; może łatwo przenosić tabele z MyISAM do InnoDB. Tak, jest na to moduł!

mikeytown2
źródło