sql >> Databáze >  >> RDS >> Mysql

Zlepšení výkonu MySQL s pokročilým nastavením InnoDB

Před chvílí jsme diskutovali o tom, jak nakonfigurovat InnoDB pro vysoký výkon, ale ještě jsme nemluvili o tom, jak můžeme zlepšit výkon MySQL při použití pokročilých nastavení InnoDB. Tento blogový příspěvek by měl poskytnout trochu podrobnější pohled na toto téma.

Vysvětlení InnoDB

Než se skutečně ponoříme hlouběji do nastavení InnoDB, měli bychom pravděpodobně porozumět základům:InnoDB je úložiště pro MySQL, MariaDB a Percona Server. Motor byl známý jako InnoDB Plugin, který vyžaduje nastavení a instalaci pluginu. Až do vydání MySQL 5.5.5 již InnoDB není plugin a je nyní součástí balíčku MySQL jako jeden z podporovaných úložišť pro MySQL. Od vydání MySQL 5.6 se InnoDB stal výchozím úložištěm – je to univerzální úložiště, které vyvažuje vysokou spolehlivost a vysoký výkon. Mezi klíčové výhody InnoDB patří podpora zamykání na úrovni řádků, cizí klíče a dodržování modelu ACID (Atomicity Consistency Isolation Durability) – ACID je sada vlastností, které mají zaručit platnost dat navzdory chybám, výpadkům napájení a dalším problémům. InnoDB má rozsáhlý seznam proměnných a některé z nich pomáhají zlepšit výkon zejména na typu hardwaru a dostupných zdrojích vašeho databázového serveru. Mezi ně patří:

  • innodb_data_file_path je soubor, kde jsou uložena data z tabulek InnoDB.
  • innodb_buffer_pool_size je vyrovnávací paměť, kterou InnoDB používá k ukládání dat a indexů svých tabulek do mezipaměti.
  • innodb_log_file_size znázorňuje velikost souborů protokolu InnoDB. Čím větší je innodb_log_file_size, tím delší je doba obnovy, kterou potřebujete v případě havárie.
  • innodb_log_buffer_size používá InnoDB k zápisu do souborů protokolu na disku.
  • innodb_flush_log_at_trx_commit kontroluje rovnováhu mezi výkonem a dodržováním ACID. Výchozí hodnota je 1, což pomáhá udržovat InnoDB ACID kompatibilní – otočením innodb_flush_log_at_trx_commit na 2 získáte velmi vysokou rychlost zápisu, ale může dojít ke ztrátě transakcí v hodnotě až jedné sekundy.

K dispozici jsou také pokročilá nastavení InnoDB, která lze nastavit, aby se výkon MySQL ještě zlepšil. Nyní se na ně podíváme.

Pokročilá nastavení InnoDB

Jak již bylo uvedeno výše, InnoDB má pokročilá nastavení, která lze použít k dalšímu zlepšení výkonu (nebudeme vypisovat úplně všechna, ale uvedená nastavení by vám měla poskytnout docela dobré představu o tom, jak mocný InnoDB skutečně je):

  • InnoDB lze zakázat – pokud chcete zakázat InnoDB, jednoduše upravte soubor my.cnf a přidejte skip-innodb do sekce [mysqld]. Poté restartujte server MySQL - InnoDB by nyní měl být deaktivován. Alternativně můžete použít volbu --innodb:nastavením na OFF se motor vypne. Uvědomte si však, že tyto možnosti jsou od verze MySQL 5.7.5 zastaralé.
  • InnoDB také poskytuje konfigurovatelný zamykací mechanismus, který může zlepšit výkon příkazů SQL, které přidávají řádky do tabulek se sloupci AUTO_INCREMENT:režimy automatického přírůstku lze konfigurovat při spuštění pomocí volby innodb_autoinc_lock_mode. Možnost má tři nastavení pro specifikaci režimu zámku - režim zámku může být 0 („tradiční“), 1 („po sobě jdoucí“) nebo 2 („prokládaný“). Hodnoty nabízejí výkon v závislosti na typu vložení databáze. Stručně řečeno, 0 nabízí kompatibilitu se staršími verzemi MySQL a Innodb. Hodnota 1 nabízí větší bezpečnost a deterministický přístup pro replikaci založenou na příkazech (SBR). Zatímco hodnota 2 má škálovatelnější a nejrychlejší režim uzamčení, ale řádky vložené jakýmkoli daným příkazem nemusí být po sobě jdoucí. Další informace naleznete v dokumentaci k MySQL.
  • InnoDB vám dává možnost rozdělit zásobník vyrovnávací paměti na více segmentů (funkce je dostupná pouze od MySQL 5.5) – nastavení innodb_buffer_pool_instances vám umožňuje zlepšit škálovatelnost MySQL na počítačích s více jádry. Ve výchozím nastavení je hodnota tohoto nastavení 1, pokud je innodb_buffer_pool_size menší než 1 GB, a v opačném případě 8:číslo určuje počet oblastí, na které je fond vyrovnávacích pamětí InnoDB rozdělen. Toto nastavení lze použít k zapojení více jader, jak si to vysvětlíme později.
  • InnoDB nabízí čtyři úrovně izolace transakcí (tx_isolation v <5.7, ale Transaction_isolation ve verzi 5.7 a novější):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ a SERIALIZABLE:tyto úrovně izolace jsou „I“ ve zkratce ACID :
    • Když se používá READ UNCOMMITTED, jedna transakce může vidět nepotvrzené změny jinou transakcí. Tato úroveň izolace umožňuje nečisté čtení.
    • Když se používá READ COMMITTED, můžete si být jisti, že všechna přečtená data byla potvrzena v okamžiku, kdy byla přečtena.
    • Když se používá REPEATABLE READ, používá se vyšší úroveň izolace. Kromě všeho, co je zaručeno úrovní READ COMMITTED, také zaručuje, že již přečtená data se nemohou změnit.
    • Když se používá SERIALIZABLE, používá se ještě vyšší úroveň izolace. Kromě všeho, co je garantováno úrovní izolace OPAKOVATELNÉ ČTENÍ, také zaručuje, že při následných čteních nebudou vidět žádná nová data.
  • InnoDB také umožňuje definovat celkovou I/O kapacitu dostupnou pro InnoDB úpravou proměnné innodb_io_capacity. Hodnota této proměnné by měla být nastavena přibližně na počet IOPS, které může systém provést za sekundu:při nastavování hodnoty tohoto parametru mějte na paměti, že hodnoty kolem 100 jsou vhodnější pro HDD, zatímco SSD mohou mít prospěch z vyšších hodnot. . Pomoci může také proměnná innodb_io_capacity_max:tato proměnná umožňuje InnoDB proplachovat agresivněji, což znamená, že rychlost I/O operací může překročit limit definovaný innodb_io_capacity – v takových situacích operace nepřekročí hodnotu definovanou proměnnou innodb_io_capacity_max .
  • InnoDB vám také umožňuje řídit, kolik vláken na pozadí je dostupných pro I/O operace:počet I/O vláken přidělených operacím čtení lze řídit proměnnou innodb_read_io_threads, zatímco počet I/O O vlákna přidělená operacím zápisu lze řídit proměnnou innodb_write_io_threads. Výchozí hodnota pro oba tyto parametry je 4 a maximální povolená hodnota je 64.
  • InnoDB má schopnost změnit určitá varování InnoDB na chyby:k tomu stačí nastavit proměnnou innodb_strict_mode na ON:tato proměnná ovlivňuje zpracování syntaktických chyb pro operace CREATE TABLE, ALTER TABLE a CREATE INDEX :deaktivace této proměnné může vyřešit chyby „Velikost řádku je příliš velká“. Chcete-li přísný režim zakázat, nastavte innodb_strict_mode na VYPNUTO.
  • InnoDB lze do určité míry chránit proti úplnému prohledávání tabulek narušujícímu data uložená v mezipaměti ve fondu vyrovnávacích pamětí zvýšením proměnné innodb_old_blocks_time. Minimální hodnota pro toto nastavení je 0, výchozí hodnota je 1000.
  • Pokud spouštíte operace údržby na tabulkách InnoDB, které obsahují FULLTEXT indexy, zvažte zapnutí proměnné innodb_optimize_fulltext_only na hodnotu ON – po aktivaci této proměnné by dotaz OPTIMIZE TABLE měl běžet rychleji, protože přeskočí reorganizaci dat ve stole. Upozorňujeme, že toto nastavení má být povoleno pouze dočasně, takže jej po dokončení optimalizace možná budete chtít vypnout.
  • Chcete-li spustit InnoDB v režimu pouze pro čtení, povolte nastavení innodb_read_only. Když je toto nastavení povoleno, můžete se dotazovat na tabulky InnoDB, kde je datový adresář MySQL na médiu pouze pro čtení.

Jak InnoDB zapojit více jader

InnoDB můžete také přimět, aby zapojovalo více jader tím, že využijete jeho schopnosti multithreadingu:překvapivě toho není příliš těžké dosáhnout – stačí upravit pár nastavení. Zde je návod, jak to udělat:

  1. Ponechte volbu innodb_thread_concurrency na výchozí hodnotě 0. Tím necháte InnoDB rozhodnout o nejlepším počtu souběžných lístků (určují počet vláken, která mohou současně vstoupit do InnoDB), které se mají otevřít pro dané MySQL nastavení instance. Pro MariaDB počínaje 10.5 je označena jako zastaralá, takže by dávalo smysl, aby MySQL tuto hodnotu nastavila na 0, protože výpočetní zdroje byly ve srovnání s počátky MySQL sofistikované.
  2. Jakmile je možnost innodb_thread_concurrency nastavena na 0, nastavte hodnoty innodb_read_io_threads i innodb_write_io_threads na jejich maximální hodnoty 64. To by mělo zapojit více jader.

Přehled

Abychom to shrnuli, InnoDB je extrémně výkonný úložný engine. Výkon tohoto úložiště je přímo ovlivněn nastavením, které tento stroj používá. Pokud tedy chcete zlepšit výkon své instance MySQL, nezapomeňte mít na paměti alespoň několik tipů zmíněných v tomto článku. Vyladění nastavení ohledně motoru a jejich použití, když je to vhodné, by vám mělo poskytnout výhodu.


  1. Jak převést časové razítko s milisekundami na datum v Oracle

  2. jak mohu vytvořit nový soubor XML z existující databáze v databázi PostgreSQL pomocí javy

  3. Upgrade sloupce varchar na typ enum v postgresql

  4. Jak se počítá shlukovací faktor Oracle Index