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

Poprawa wydajności MySQL dzięki zaawansowanym ustawieniom InnoDB

Omówiliśmy już jakiś czas temu, jak skonfigurować InnoDB pod kątem wysokiej wydajności, jednak nie dyskutowaliśmy jeszcze, w jaki sposób możemy poprawić wydajność MySQL, korzystając z zaawansowanych ustawień InnoDB. Ten wpis na blogu powinien zapewnić nieco więcej wglądu w ten temat.

Wyjaśnienie InnoDB

Zanim zagłębimy się w ustawienia InnoDB, prawdopodobnie powinniśmy zrozumieć podstawy:InnoDB to silnik pamięci masowej dla MySQL, MariaDB i Percona Server. Silnik był znany jako InnoDB Plugin, co wymaga konfiguracji i instalacji wtyczki. Do czasu wydania MySQL 5.5.5, InnoDB nie jest już wtyczką i jest teraz częścią pakietu MySQL jako jeden z obsługiwanych silników pamięci masowej dla MySQL. Od czasu wydania MySQL 5.6 InnoDB stał się domyślnym silnikiem pamięci masowej — jest to silnik pamięci ogólnego przeznaczenia, który równoważy wysoką niezawodność i wysoką wydajność. Kluczowe zalety InnoDB obejmują obsługę blokowania na poziomie wierszy, kluczy obcych i podążanie za modelem ACID (Atomicity Consistency Isolation Durability) - ACID to zestaw właściwości, które mają zagwarantować poprawność danych pomimo błędów, awarii zasilania i innych problemów. InnoDB ma obszerną listę zmiennych, a niektóre z nich pomagają poprawić wydajność, zwłaszcza w przypadku typu sprzętu i dostępnych zasobów serwera bazy danych. Wśród nich są:

  • innodb_data_file_path to plik, w którym przechowywane są dane z tabel InnoDB.
  • innodb_buffer_pool_size to bufor pamięci, którego InnoDB używa do buforowania danych i indeksów swoich tabel.
  • innodb_log_file_size przedstawia rozmiar plików dziennika InnoDB. Im większy rozmiar innodb_log_file_size, tym dłuższy czas odzyskiwania potrzebny w przypadku awarii.
  • innodb_log_buffer_size jest używany przez InnoDB do zapisywania plików dziennika na dysku.
  • innodb_flush_log_at_trx_commit kontroluje równowagę między wydajnością a zgodnością z ACID. Domyślna wartość to 1, co pomaga zachować zgodność z InnoDB ACID — zmiana innodb_flush_log_at_trx_commit na 2 zapewnia bardzo dużą prędkość zapisu, ale można stracić nawet jedną sekundę transakcji.

Istnieją również zaawansowane ustawienia InnoDB, które można ustawić, aby jeszcze bardziej poprawić wydajność MySQL. Przyjrzymy się im teraz.

Zaawansowane ustawienia InnoDB

Jak już wspomniano powyżej, InnoDB ma zaawansowane ustawienia, które można wykorzystać do dalszej poprawy jego wydajności (nie wymienimy absolutnie wszystkich z nich, ale wymienione ustawienia powinny dać całkiem niezły pomysł na to, jak potężny jest naprawdę InnoDB):

  • InnoDB można wyłączyć - jeśli chcesz wyłączyć InnoDB, po prostu zmodyfikuj plik my.cnf i dodaj skip-innodb w sekcji [mysqld]. Następnie uruchom ponownie serwer MySQL - InnoDB powinien być teraz wyłączony. Alternatywnie możesz skorzystać z opcji --innodb:ustawienie jej na OFF wyłącza silnik. Pamiętaj jednak, że te opcje są przestarzałe w MySQL 5.7.5.
  • InnoDB udostępnia również konfigurowalny mechanizm blokowania, który może poprawić wydajność instrukcji SQL, które dodają wiersze do tabel z kolumnami AUTO_INCREMENT:tryby automatycznego zwiększania można skonfigurować podczas uruchamiania za pomocą opcji innodb_autoinc_lock_mode. Opcja ma trzy ustawienia określania trybu blokady - tryb blokady może być 0 („tradycyjny”), 1 („kolejny”) lub 2 („przeplatany”). Wartości oferują wydajność w zależności od typu wstawiania bazy danych. Krótko mówiąc, 0 oferuje kompatybilność ze starszymi wersjami MySQL i Innodb. Wartość 1 zapewnia większe bezpieczeństwo i deterministyczne podejście do replikacji opartej na instrukcjach (SBR). Podczas gdy wartość 2 ma bardziej skalowalny i najszybszy tryb blokady, ale wiersze wstawiane przez daną instrukcję mogą nie być kolejne. Więcej informacji znajdziesz w dokumentacji MySQL.
  • InnoDB daje możliwość podzielenia puli buforów na wiele segmentów (funkcja jest dostępna tylko w MySQL 5.5) – ustawienie innodb_buffer_pool_instances umożliwia poprawę skalowalności MySQL na maszynach z wieloma rdzeniami. Domyślnie wartość tego ustawienia wynosi 1, jeśli innodb_buffer_pool_size jest mniejsza niż 1 GB, a 8 w przeciwnym razie:liczba określa liczbę regionów, na które podzielona jest pula buforów InnoDB. To ustawienie może być użyte do zaangażowania większej liczby rdzeni, wyjaśnimy, jak to zrobić później.
  • InnoDB oferuje cztery poziomy izolacji transakcji (tx_isolation w <5.7, ale transaction_isolation w wersji 5.7 i nowszych):READ UNCOMMITTED, READ COMMITTED, REPEAABLE READ i SERIALIZABLE:te poziomy izolacji to „I” w akronimie ACID :
    • Gdy w użyciu jest READ UNCOMMITTED, jedna transakcja może zobaczyć niezatwierdzone zmiany w innej transakcji. Ten poziom izolacji pozwala na brudne odczyty.
    • Gdy READ COMMITTED jest w użyciu, możesz mieć pewność, że wszelkie odczytane dane zostały zatwierdzone w momencie ich odczytania.
    • Gdy używany jest ODCZYT POWTARZALNY, używany jest wyższy poziom izolacji. Oprócz wszystkiego, co gwarantuje poziom READ COMMITTED, gwarantuje on również, że żadne dane, które już zostały odczytane, nie mogą się zmienić.
    • Gdy używana jest funkcja SERIALIZABLE, używany jest jeszcze wyższy poziom izolacji. Oprócz wszystkiego, co gwarantuje poziom izolacji ODCZYT POWTARZALNY, gwarantuje to również, że żadne nowe dane nie będą widoczne podczas kolejnych odczytów.
  • InnoDB umożliwia również zdefiniowanie całkowitej przepustowości we/wy dostępnej dla InnoDB poprzez modyfikację zmiennej innodb_io_capacity. Wartość tej zmiennej powinna być ustawiona na mniej więcej liczbę IOPS, które system może wykonać na sekundę:ustawiając wartość tego parametru, należy pamiętać, że wartości około 100 są bardziej odpowiednie dla dysków twardych, podczas gdy wyższe wartości mogą być korzystne dla dysków SSD . Pomocna może być również zmienna innodb_io_capacity_max:ta zmienna pozwala InnoDB na bardziej agresywne opróżnianie, co oznacza, że ​​szybkość operacji I/O może przekroczyć limit określony przez innodb_io_capacity - w takich sytuacjach operacje nie przekroczą wartości określonej przez zmienną innodb_io_capacity_max .
  • InnoDB pozwala również kontrolować, ile wątków w tle jest dostępnych dla operacji we/wy:liczba wątków we/wy przydzielonych do operacji odczytu może być kontrolowana przez zmienną innodb_read_io_threads, podczas gdy liczba wątków we/wy O wątki przydzielone do operacji zapisu mogą być kontrolowane przez zmienną innodb_write_io_threads. Domyślna wartość obu tych parametrów to 4, a maksymalna dozwolona wartość to 64.
  • InnoDB ma możliwość przekształcania niektórych ostrzeżeń InnoDB w błędy:w tym celu wystarczy ustawić zmienną innodb_strict_mode na ON:ta zmienna wpływa na obsługę błędów składniowych dla operacji CREATE TABLE, ALTER TABLE i CREATE INDEX :wyłączenie tej zmiennej może rozwiązać błędy „Zbyt duży rozmiar wiersza”. Aby wyłączyć tryb ścisły, ustaw innodb_strict_mode na WYŁ.
  • InnoDB można w pewnym stopniu zabezpieczyć przed pełnymi skanami tabel zakłócającymi dane buforowane w puli buforów, zwiększając wartość zmiennej innodb_old_blocks_time. Minimalna wartość tego ustawienia to 0, domyślna to 1000.
  • Jeśli wykonujesz operacje konserwacyjne na tabelach InnoDB, które zawierają indeksy FULLTEXT, rozważ włączenie zmiennej innodb_optimize_fulltext_only na ON — po włączeniu tej zmiennej zapytanie OPTIMIZE TABLE powinno działać szybciej, ponieważ pominie reorganizację danych na stole. Pamiętaj, że to ustawienie ma być włączone tylko tymczasowo, więc możesz chcieć je wyłączyć po zakończeniu optymalizacji.
  • Aby uruchomić InnoDB w trybie tylko do odczytu, włącz ustawienie innodb_read_only. Gdy to ustawienie jest włączone, możesz wysyłać zapytania do tabel InnoDB, w których katalog danych MySQL znajduje się na nośniku tylko do odczytu.

Sprawianie, że InnoDB angażuje więcej rdzeni

Możesz także sprawić, by InnoDB angażowało więcej rdzeni, wykorzystując jego możliwości wielowątkowości:co zaskakujące, nie jest to trudne do osiągnięcia - wystarczy zmodyfikować kilka ustawień. Oto jak to zrobić:

  1. Pozostaw opcję innodb_thread_concurrency na domyślną wartość 0. W ten sposób pozwalasz InnoDB decydować o najlepszej liczbie biletów współbieżności (określają one liczbę wątków, które mogą jednocześnie wejść do InnoDB) do otwarcia dla danego MySQL konfiguracja instancji. W przypadku MariaDB, począwszy od 10.5, jest ona oznaczona jako przestarzała, więc ustawienie jej na 0 w MySQL miałoby sens, ponieważ zasoby obliczeniowe były wyrafinowane w porównaniu z początkami MySQL.
  2. Gdy opcja innodb_thread_concurrency zostanie ustawiona na 0, ustaw zarówno innodb_read_io_threads, jak i innodb_write_io_threads na ich maksymalne wartości 64. Powinno to zaangażować więcej rdzeni.

Podsumowanie

Podsumowując, InnoDB to niezwykle potężny silnik pamięci masowej. Na wydajność tego aparatu magazynu mają bezpośredni wpływ ustawienia używane przez ten aparat. Jeśli więc chcesz poprawić wydajność swojej instancji MySQL, pamiętaj o co najmniej kilku wskazówkach wymienionych w tym artykule. Dostrajanie ustawień dotyczących silnika i używanie ich w razie potrzeby powinno dać ci przewagę.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakiego typu danych użyć dla pola haszowanego hasła i jakiej długości?

  2. DATABASE() — pobierz aktualną nazwę bazy danych w MySQL

  3. Jak szyfrować ruch bazy danych w chmurze hybrydowej

  4. Jak mogę pominąć dane wyjściowe nagłówka kolumny dla pojedynczej instrukcji SQL?

  5. Jak tworzyć dynamiczne tabele przestawne w MySQL