Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajność MySQL:MyISAM kontra InnoDB

Głównym czynnikiem wpływającym na wydajność bazy danych jest silnik pamięci używany przez bazę danych, a dokładniej jej tabele. Różne silniki pamięci masowej zapewniają lepszą wydajność w jednej sytuacji niż w innej. Do ogólnego użytku należy wziąć pod uwagę dwóch rywali. Są to MyISAM, który jest domyślnym silnikiem pamięci masowej MySQL, lub InnoDB, który jest alternatywnym silnikiem wbudowanym w MySQL, przeznaczonym do wysokowydajnych baz danych. Zanim zrozumiemy różnicę między dwoma silnikami pamięci masowej, musimy zrozumieć termin „blokowanie”.

Co blokuje w MySQL?

Aby chronić integralność danych przechowywanych w bazach danych, MySQL stosuje blokowanie. Krótko mówiąc, blokowanie oznacza ochronę danych przed dostępem. Po zastosowaniu blokady dane nie mogą być modyfikowane z wyjątkiem zapytania, które zainicjowało blokadę. Blokowanie jest niezbędnym elementem zapewniającym dokładność przechowywanych informacji. Każdy aparat pamięci ma inną metodę blokowania. W zależności od Twoich praktyk dotyczących danych i zapytań, jeden aparat może przewyższyć inny. W tej serii przyjrzymy się dwóm najczęstszym typom blokad stosowanych przez nasze dwa silniki pamięci masowej.

Blokowanie stołu: Technika blokowania całej tabeli, gdy co najmniej jedna komórka w tabeli wymaga aktualizacji lub usunięcia. Blokowanie tabeli jest domyślną metodą stosowaną przez domyślny mechanizm pamięci masowej MyISAM.

Przykład:blokowanie tabeli MyISAM Kolumna A Kolumna B Kolumna C
Aktualizacja zapytania 1 Wiersz 1 Pisanie dane dane
Zapytanie 2 WYBIERZ (Czekaj) Wiersz 2 dane dane dane
Zapytanie 3 UPDATE (czekaj) Wiersz 3 dane dane dane
Zapytanie 4 WYBIERZ (Czekaj) Wiersz 4 dane dane dane
Zapytanie 5 WYBIERZ (Czekaj) Wiersz 5 dane dane dane
Przykład ilustruje, jak pojedyncza operacja zapisu blokuje całą tabelę, powodując, że inne zapytania czekają na zakończenie zapytania UPDATE.

Blokowanie na poziomie wiersza: Czynność blokowania efektywnego zakresu wierszy w tabeli, podczas gdy co najmniej jedna komórka w zakresie jest modyfikowana lub usuwana. Blokowanie na poziomie wiersza to metoda używana przez aparat pamięci InnoDB i jest przeznaczona dla baz danych o wysokiej wydajności.

Przykład:blokowanie na poziomie wiersza InnoDB Kolumna A Kolumna A Kolumna A
Aktualizacja zapytania 1 Wiersz 1 Pisanie dane dane
Zapytanie 2 WYBIERZ Wiersz 2 Czytanie dane dane
Zapytanie 3 AKTUALIZACJA Wiersz 3 dane Pisanie dane
Zapytanie 4 WYBIERZ Wiersz 4 Czytanie Czytanie Czytanie
Zapytanie 5 WYBIERZ Wiersz 5 Czytanie dane Czytanie
Przykład pokazuje, jak użycie blokowania na poziomie wiersza umożliwia uruchamianie wielu zapytań w poszczególnych wierszach, blokując tylko aktualizowane wiersze zamiast całej tabeli.

MyISAM kontra InnoDB

Porównując dwa silniki pamięci masowej, dochodzimy do sedna sporu między używaniem InnoDB zamiast MyISAM. Aplikacja lub witryna internetowa, która ma często używaną tabelę, działa wyjątkowo dobrze, korzystając z silnika pamięci masowej InnoDB, rozwiązując wąskie gardła blokujące tabele. Jednak kwestia używania jednego nad drugim jest subiektywna, ponieważ żadne z nich nie jest idealne we wszystkich sytuacjach. Oba silniki pamięci masowej mają swoje mocne strony i ograniczenia. Dokładna wiedza na temat struktury bazy danych i praktyk dotyczących zapytań ma kluczowe znaczenie dla wyboru najlepszego mechanizmu przechowywania dla tabel.

MyISAM przewyższa InnoDB w przypadku dużych tabel, które wymagają znacznie większej aktywności odczytu niż zapisu. Czytelność MyISAM przewyższa InnoDB, ponieważ zablokowanie całej tabeli jest szybsze niż ustalenie, które wiersze są zablokowane w tabeli. Im więcej informacji w tabeli, tym więcej czasu zajmuje InnoDB ustalenie, które z nich są niedostępne. Jeśli Twoja aplikacja opiera się na ogromnych tabelach, które nie zmieniają często danych, MyISAM przewyższa InnoDB. I odwrotnie, InnoDB przewyższa MyISAM, gdy dane w tabeli często się zmieniają. Zmiany w tabeli zapisują dane częściej niż odczytywanie danych na sekundę. W takich sytuacjach InnoDB może łatwiej nadążyć z dużą liczbą żądań niż blokowanie całej tabeli dla każdego z nich.

Czy powinienem używać InnoDB z witrynami WordPress, Magento lub Joomla?

Krótka odpowiedź brzmi tak, w większości przypadków. Najbardziej pomocni ludzie Liquid Web w zakresie hostingu Zespoły wsparcia napotkały kilka blokujących tabele wąskich gardeł, gdy klienci korzystają z niektórych standardowych aplikacji internetowych. Większość użytkowników popularnych aplikacji innych firm, takich jak WordPress, Magento i Joomla, ma ograniczoną wiedzę na temat podstawowych komponentów bazy danych lub kodu, który pozwala podejmować świadome decyzje dotyczące silników pamięci masowej. Większość wąskich gardeł blokujących tabele z tych systemów zarządzania treścią (CMS) zazwyczaj rozwiązuje się, zmieniając wszystkie tabele witryny na InnoDB zamiast domyślnego MyISAM. Jeśli hostujesz wiele tego typu CMS na swoim serwerze, byłoby korzystne zmienić domyślny silnik przechowywania w MySQL, aby używał InnoDB dla wszystkich nowych tabel, tak aby wszelkie nowe instalacje tabel zaczynały się od InnoDB.

Ustawianie domyślnego silnika pamięci

Ustaw domyślny silnik pamięci na InnoDB, dodając default_storage_engine=InnoDB do [mysqld] sekcji pliku konfiguracyjnego systemu znajdującego się pod adresem:/etc/my.cnf. Ponowne uruchomienie usługi MySQL jest konieczne, aby serwer mógł wykryć zmiany w pliku.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Konwertowanie wszystkich tabel między MyISAM i InnoDB

Niestety, MySQL z natury nie ma opcji konwersji tabel, co pozostawia każdą tabelę indywidualnie. Zespół wsparcia Liquid Web opracował łatwy do wykonania plan konserwacji dla tego procesu. Skrypt, który możesz uruchomić na wymaganym serwerze przez dostęp do powłoki (SSH), przekonwertuje wszystkie tabele między silnikami pamięci masowej.

Uwaga Należy odpowiednio zaplanować wykonywanie operacji wsadowych tego rodzaju na wypadek przestoju. Najlepszą praktyką jest wykonanie kopii zapasowej wszystkich baz danych MySQL przed wprowadzeniem zmiany tej wielkości, co zapewnia łatwy punkt przywracania, aby zapobiec utracie danych.

Krok 1:  Przygotuj

Planuj rozpocząć w porze dnia, w której przestój miałby minimalne konsekwencje. Sam proces nie wymaga przestojów, jednak przestój może być konieczny, aby odzyskać siły po nieprzewidzianych okolicznościach.

Krok 2:  Utwórz kopię zapasową wszystkich baz danych w pliku

Poniższe polecenie tworzy kopię zapasową jednego pliku wszystkich baz danych o nazwie all-databases-backup.sqld i można ją usunąć po pomyślnej konwersji i braku widocznych problemów.
mysqldump --all-databases > all-databases-backup.sql

Krok 3:  Zapisuj istniejące silniki tabel do pliku

Uruchom następujący skrypt, aby zarejestrować istniejące aparaty tabel w pliku o nazwie table-engine-backup.sql . Możesz następnie "zaimportować" lub "uruchomić" ten plik później, aby w razie potrzeby przekonwertować go z powrotem do oryginalnych silników.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Jeśli z jakiegokolwiek powodu musisz przywrócić silniki tabel, uruchom:
mysql < table-engine-backup.sql

Krok 4a:  Konwertuj tabele MyISAM na InnoDB

Poniższe polecenie będzie kontynuowane, nawet jeśli tabela ulegnie awarii i poinformuje Cię, które tabele nie zostały przekonwertowane. Dane wyjściowe są zapisywane w pliku o nazwie convert-to-innodb.log do późniejszego przegląduw.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Krok 4b:Konwertuj wszystkie tabele InnoDB na MyISAM

To polecenie będzie kontynuowane, nawet jeśli tabela ulegnie awarii i poinformuje Cię, które tabele nie zostały przekonwertowane. Dane wyjściowe są również zapisywane w pliku o nazwie convert-to-myisam.log do późniejszego sprawdzenia.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Konwertowanie pojedynczej tabeli między MyISAM a InnoDB

Poniższe polecenia ilustrują, jak przeprowadza się konwersję pojedynczej tabeli.

Uwaga:Zastąp database_name prawidłową nazwą bazy danych i table_name poprawną nazwą tabeli. Przed kontynuowaniem upewnij się, że masz prawidłową kopię zapasową danej tabeli.

Utwórz kopię zapasową pojedynczej tabeli do pliku
mysqldump database_name table_name > backup-table_name.sql

Konwertuj pojedynczą tabelę na InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Konwertuj pojedynczy stół na MyISAM:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Zapoznaj się z innymi artykułami z tej serii, „Wydajność MySQL:identyfikowanie długich zapytań”, aby wskazać wolne zapytania w bazie danych. Bądź na bieżąco z naszym następnym artykułem, w którym omówimy buforowanie i optymalizację.

Nawigacja po seriach<>

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praca z kursorami SQL

  2. Jak przechowywać dane w Unicode w języku hindi?

  3. Samouczek MySQL – Zrozumienie sekund kryjących się za wartością nadrzędną

  4. Kącik bazy danych:Przewodnik dla początkujących po silnikach pamięci masowej Mysql

  5. Najlepszy sposób na WSTAWIANIE wielu wartości w mysqli?