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

Výkon MySQL:MyISAM vs InnoDB

Hlavním faktorem výkonu databáze je úložný stroj používaný databází a konkrétněji její tabulky. Různé moduly úložiště poskytují lepší výkon v jedné situaci než v jiné. Pro obecné použití je třeba vzít v úvahu dva uchazeče. Jedná se o MyISAM, což je výchozí úložiště MySQL, nebo InnoDB, což je alternativní engine vestavěný do MySQL určený pro vysoce výkonné databáze. Než pochopíme rozdíl mezi těmito dvěma úložnými enginy, musíme porozumět termínu „uzamykání“.

Co je zamykání v MySQL?

K ochraně integrity dat uložených v databázích používá MySQL zamykání. Zamykání jednoduše řečeno znamená ochranu dat před přístupem. Když je použit zámek, data nelze upravit jinak než dotazem, který zámek inicioval. Zamykání je nezbytnou součástí pro zajištění přesnosti uložených informací. Každý úložný stroj používá jiný způsob zamykání. V závislosti na vašich datech a postupech dotazování může jeden motor překonat druhý. V této sérii se podíváme na dva nejběžnější typy zamykání používané našimi dvěma skladovacími motory.

Zamykání stolu: Technika uzamčení celé tabulky, když je třeba aktualizovat nebo odstranit jednu nebo více buněk v tabulce. Zamykání tabulky je výchozí metodou používanou výchozím modulem úložiště, MyISAM.

Příklad:Uzamčení tabulky MyISAM Sloupec A Sloupec B Sloupec C
AKTUALIZACE dotazu 1 Řádek 1 Psaní data data
VYBRAT dotaz 2 (Počkejte) Řádek 2 data data data
AKTUALIZACE dotazu 3 (Počkejte) Řádek 3 data data data
VYBRAT dotaz 4 (Počkejte) Řádek 4 data data data
VYBRAT dotaz 5 (Počkejte) Řádek 5 data data data
Příklad ukazuje, jak jediná operace zápisu uzamkne celou tabulku, což způsobí, že ostatní dotazy čekají na dokončení dotazu UPDATE.

Zamykání na úrovni řádků: Akt uzamčení efektivního rozsahu řádků v tabulce, zatímco jedna nebo více buněk v rozsahu je upraveno nebo odstraněno. Zamykání na úrovni řádků je metoda, kterou používá modul úložiště InnoDB a je určena pro vysoce výkonné databáze.

Příklad:InnoDB zamykání na úrovni řádků Sloupec A Sloupec A Sloupec A
AKTUALIZACE dotazu 1 Řádek 1 Psaní data data
VYBRAT dotaz 2 Řádek 2 Čtení data data
AKTUALIZACE dotazu 3 Řádek 3 data Psaní data
VYBRAT dotaz 4 Řádek 4 Čtení Čtení Čtení
VYBRAT dotaz 5 Řádek 5 Čtení data Čtení
Příklad ukazuje, jak použití zamykání na úrovni řádků umožňuje spuštění více dotazů na jednotlivých řádcích tím, že zamykáte pouze aktualizované řádky namísto celé tabulky.

MyISAM vs. InnoDB

Porovnáním dvou úložných enginů se dostáváme k jádru sporu mezi používáním InnoDB oproti MyISAM. Aplikace nebo webová stránka, která má často používanou tabulku, funguje výjimečně dobře s využitím úložiště InnoDB tím, že řeší úzká místa zamykání tabulek. Otázka použití jednoho nad druhým je však subjektivní, protože žádný z nich není dokonalý ve všech situacích. Oba úložné motory mají své silné stránky a omezení. Důkladná znalost struktury databáze a postupů dotazování je rozhodující pro výběr nejlepšího úložiště pro vaše tabulky.

MyISAM překoná InnoDB na velkých tabulkách, které vyžadují mnohem větší aktivitu při čtení než při zápisu. Čitelnost MyISAM převyšuje InnoDB, protože zamykání celé tabulky je rychlejší než zjišťování, které řádky jsou v tabulce zamčené. Čím více informací v tabulce, tím více času InnoDB trvá, než zjistí, které z nich nejsou přístupné. Pokud vaše aplikace spoléhá na obrovské tabulky, které často nemění data, pak MyISAM překoná InnoDB. Naopak InnoDB překonává MyISAM, když se data v tabulce často mění. Tabulka mění data zápisu více než čtení dat za sekundu. V těchto situacích může InnoDB držet krok s velkým množstvím požadavků snadněji než zamykáním celé tabulky pro každý z nich.

Mám používat InnoDB s weby WordPress, Magento nebo Joomla?

Krátká odpověď je ve většině případů ano. Nejužitečnější lidé z Liquid Webu v oblasti hostingové podpory Týmy se setkaly s několika překážkami při zamykání tabulek, když klienti používají některé dnešní standardní webové aplikace. Většina uživatelů populárních aplikací třetích stran, jako jsou WordPress, Magento a Joomla, má omezené znalosti základních databázových komponent nebo kódu, aby mohli učinit informované rozhodnutí o úložištích. Většina úzkých míst v uzamčení tabulek z těchto systémů pro správu obsahu (CMS) je obecně vyřešena změnou všech tabulek pro web na InnoDB namísto výchozího MyISAM. Pokud na svém serveru hostujete mnoho z těchto typů CMS, bylo by prospěšné změnit výchozí modul úložiště v MySQL tak, aby pro všechny nové tabulky používal InnoDB, aby jakékoli nové instalace tabulek začínaly s InnoDB.

Nastavení výchozího úložiště

Nastavte svůj výchozí modul úložiště na InnoDB přidáním default_storage_engine=InnoDB do [mysqld] části konfiguračního souboru systému na adrese: /etc/my.cnf. Restartování služby MySQL je nezbytné, aby server detekoval změny v souboru.

~ $ 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

Převod všech tabulek mezi MyISAM a InnoDB

Bohužel MySQL ze své podstaty nemá možnost převádět tabulky, takže každou tabulku je třeba měnit individuálně. Tým podpory Liquid Web sestavil pro tento proces snadno sledovatelný plán údržby. Skript, který můžete spustit na potřebném serveru prostřednictvím shellového přístupu (SSH), převede všechny tabulky mezi storage engine.

PoznámkaPlánujte odpovídajícím způsobem při provádění dávkových operací tohoto druhu pro případ výpadku. Nejlepší praxí je zálohovat všechny databáze MySQL před implementací změny tohoto rozsahu, což poskytuje snadný bod obnovy, který zabrání ztrátě dat.

Krok 1:  Příprava

Naplánujte si začátek v denní dobu, kdy by výpadky měly minimální důsledky. Tento proces sám o sobě nevyžaduje žádné prostoje, nicméně prostoje mohou být nezbytné k zotavení z nepředvídaných okolností.

Krok 2:  Zálohujte všechny databáze do souboru

Níže uvedený příkaz vytvoří zálohu jednoho souboru všech databází s názvem all-databases-backup.sqld a může být smazán, jakmile převod proběhne úspěšně a nenastanou žádné zjevné problémy.
mysqldump --all-databases > all-databases-backup.sql

Krok 3:  Zaznamenejte existující stroje tabulky do souboru

Spusťte následující skript a zaznamenejte existující tabulkové stroje do souboru s názvem table-engine-backup.sql . Tento soubor pak můžete „importovat“ nebo „spustit“ později a v případě potřeby jej převést zpět na původní motory.

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

Pokud potřebujete z jakéhokoli důvodu vrátit tabulkové motory zpět, spusťte:
mysql < table-engine-backup.sql

Krok 4a:  Převést tabulky MyISAM na InnoDB

Níže uvedený příkaz bude pokračovat, i když tabulka selže, a dá vám vědět, které tabulky se nepodařilo převést. Výstup se uloží do souboru s názvem convert-to-innodb.log k pozdější kontrolew.
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:Převeďte všechny tabulky InnoDB na MyISAM

Tento příkaz bude pokračovat, i když se tabulka nezdaří, a dá vám vědět, které tabulky se nepodařilo převést. Výstup se také uloží do souboru s názvem convert-to-myisam.log pro pozdější kontrolu.

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

Převod jedné tabulky mezi MyISAM a InnoDB

Následující příkazy ilustrují, jak se provádí převod jedné tabulky.

PoznámkaNahraďte název_databáze správným názvem databáze a název_tabulky správným názvem tabulky. Než budete pokračovat, ujistěte se, že máte platnou zálohu příslušné tabulky.

Zálohujte jednu tabulku do souboru
mysqldump database_name table_name > backup-table_name.sql

Převést jednu tabulku na InnoDB

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

Převést jednu tabulku na MyISAM:

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

Podívejte se na naše další články v této sérii, Výkon MySQL:Identifikace dlouhých dotazů, které vám pomohou určit pomalé dotazy ve vaší databázi. Zůstaňte naladěni na náš další článek, kde se budeme zabývat ukládáním do mezipaměti a optimalizací.

Series Navigation<>

  1. Úvod do referenčních kurzorů PL/SQL v databázi Oracle

  2. výsledky pivotního dotazu mysql s GROUP BY

  3. Vnitřnosti transakční replikace serveru SQL – část 2

  4. Jak vytvořit trasování SQL pro zachycení událostí serveru SQL