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í.