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

InnoDB indexuje před a po importu

S tímto konceptem jsem trochu experimentoval v minulé práci, kde jsme potřebovali rychlou metodu kopírování schémat mezi servery MySQL.

Při vkládání do tabulek, které mají sekundární indexy, skutečně dochází k režii výkonu. Vložky potřebují aktualizovat seskupený index (neboli tabulku) a také aktualizovat sekundární indexy. Čím více indexů tabulka má, tím větší režii způsobuje vkládání.

InnoDB má funkci zvanou vyrovnávací paměť změn což trochu pomáhá tím, že odkládá aktualizace indexu, ale nakonec se musí sloučit.

Vkládání do tabulky bez sekundárních indexů je rychlejší, takže je lákavé zkusit odložit vytvoření indexu až po načtení dat, jak popisujete.

Percona Server, pobočka MySQL, experimentoval s mysqldump --optimize-keys volba. Když použijete tuto volbu, změní výstup mysqldump tak, aby měl CREATE TABLE bez indexů, poté INSERT all data a poté ALTER TABLE pro přidání indexů po načtení dat. Viz https://www.percona.com/doc/ percona-server/LATEST/management/innodb_expanded_fast_index_creation.html

Ale podle mých zkušeností bylo čisté zlepšení výkonu malé. Vložení velkého množství řádků stále chvíli trvá, a to i pro tabulky bez indexů. Poté je třeba při obnově spustit ALTER TABLE k vytvoření indexů. U velkého stolu to chvíli trvá. Když spočítáte čas INSERTů plus čas navíc k vytvoření indexů, je to jen o několik (nízkých jednociferných) procent rychlejší než vkládání tradičním způsobem do tabulky s indexy.

Další výhodou tohoto vytváření indexu po zpracování je, že indexy jsou uloženy kompaktněji, takže pokud potřebujete ušetřit místo na disku, je to lepší důvod pro použití této techniky.

Zjistil jsem, že pro výkon je mnohem výhodnější obnovit načítání několika tabulek paralelně .

  • Nový nástroj MySQL 8.0 mysqlpump podporuje vícevláknový výpis.
  • Nástroj s otevřeným zdrojovým kódem mydumper podporuje vícevláknový výpis a má také nástroj pro obnovu s více vlákny, nazvaný myloader . Nejhorší nevýhodou mydumper/myloader je to, že dokumentace prakticky neexistuje, takže musíte být neohrožený zkušený uživatel, abyste zjistili, jak to spustit.

Další strategií je použití mysqldump --tab vypsat soubory CSV namísto skriptů SQL. Hromadné načítání souborů CSV je mnohem rychlejší než spouštění skriptů SQL pro obnovu dat. No, vypíše soubor SQL pro definici tabulky a CSV pro data k importu. Pro každou tabulku vytváří samostatné soubory. Musíte ručně znovu vytvořit tabulky načtením všech souborů SQL (je to rychlé) a poté použít mysqlimport k načtení datových souborů CSV. Nástroj mysqlimport má dokonce --use-threads možnost paralelního provádění.

Pečlivě testujte s různým počtem paralelních závitů. Moje zkušenost je, že 4 vlákna jsou nejlepší. S větším paralelismem se InnoDB stává úzkým hrdlem. Vaše zkušenosti se však mohou lišit v závislosti na verzi MySQL a kapacitě hardwaru vašeho serveru.

Nejrychlejší metoda obnovení ze všech je, když použijete nástroj fyzického zálohování, nejoblíbenější je Percona XtraBackup . To umožňuje rychlé zálohování a ještě rychlejší obnovu. Zálohované soubory jsou doslova připraveny ke zkopírování na místo a použití jako živé soubory tabulkového prostoru. Nevýhodou je, že pro provedení obnovy musíte vypnout MySQL Server.




  1. Jak MONTH() funguje v MariaDB

  2. Jak volat uloženou proceduru Oracle, která obsahuje uživatelsky definovaný typ v jazyce Java?

  3. Jaké jsou rozdíly mezi SQL a MySQL

  4. Mapovat vlastní výsledek dotazu JdbcTemplate v objektu