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?
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?
Odpowiedzi:
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 Type
kolumnie 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/
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
.
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:
COUNT
zapytań, 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ą WHERE
klauzuli.
SELECT COUNT(*) FROM table
moż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 WHERE
klauzuli. 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.
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.
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.
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 $.
innodb_file_per_table
opcji.
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done
. Dodaj odpowiednie opcje ( -uroot -psomepass
na przykład) do dwóch mysql
s, jeśli to konieczne.
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ł!