it-swarm-eu.dev

Proč je „LOAD DATA INFILE“ rychlejší než normální příkazy INSERT?

Přečetl jsem článek, který zmínil, že můžeme dosáhnout 60 000 příloh za sekund pomocí LOAD DATA IN FILE příkaz, který čte ze souborů CSV a vkládá data do databáze.

Proč by se měl lišit od běžných vložek?

ÚPRAVA:
Omezil jsem zpáteční cestu voláním pouze jednoho příkazu INSERT:

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');

Co tohle?

22
ALH

INFORMACE O ZATÍŽENÝCH ÚDAJECH a rozšířené VLOŽKY mají každý zřetelné výhody.

LOAD DATA INFILE je navržen pro hromadné načítání dat tabulky v jedné operaci spolu se zvonky a píšťalky k provádění tings jako:

  • Přeskakování počátečních čar
  • Přeskakování specifických sloupců
  • Transformace specifických sloupců
  • Načítání konkrétních sloupců
  • Řešení duplicitních klíčových problémů

K analýze je zapotřebí méně režijních nákladů

Na druhou stranu, pokud importujete pouze 100 řádků namísto 1 000 000 řádků, je rozšířené INSERT rozumné.

Všimněte si, že mysqldump byl navržen kolem rozšířených INSERTů kvůli přenášení návrhů tabulek spolu s daty, protože provádí injekce stovek nebo tisíců řádků na INSERT. ZATÍŽENÍ ÚDAJŮ O ÚDAJI vždy vytvoří fyzickou dichomoty mezi schématem a daty.

Z pohledu aplikace je LOAD DATA INFILE také necitlivější na změnu schématu než rozšířené INSERTs.

Jeden může jít tam a zpět na dobré, špatné a ošklivé použití ZATÍŽENÝCH ÚDAJŮ. Bez ohledu na to, jakou techniku ​​používáte, musíte vždy nastavit bulk_insert_buffer_size . Proč?

Podle dokumentace MySQL na bulk_insert_buffer_size:

MyISAM používá speciální stromovou mezipaměť, aby zrychlil hromadné vkládání INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., a LOAD DATA INFILE při přidávání dat do neprázdných tabulky. Tato proměnná omezuje velikost stromu mezipaměti v bajtech na vlákno. Nastavení na 0 zakáže tuto optimalizaci. Výchozí hodnota je 8 MB.

Po celá léta jsem viděl klienta poté, co to klient nenastavil a nechal jej na 8 MB. Poté, když se rozhodnou použít ZATÍŽENÍ DATOVÝCH ÚDAJŮ nebo importovat mysqldumps, mohou cítit něco špatně. Obvykle doporučuji nastavení na mírnou 256M. V některých případech 512 M.

Jakmile budete mít dostatečně velký objem INSERT vyrovnávací paměti, použití obou technik se stane akademickým a scvrkne na osobní volbu. Pro aplikace, ve kterých hromadně INSERT na 100 řádků na vyžádání, držte se rozšířených INSERTů.

Zcela spravedlivě je říkat, že LOAD DATA INFILE je rychlejší než běžné příkazy INSERT, což je druh načteného příkazu hlavně proto, že konfigurace není brána v úvahu. I když nastavíte měřítko mezi LOAD DATA INFILE a rozšířenými INSERTs s náležitým hromadným vložením_buffer_size, nanosekundy uložené při analýze každého řádku mohou přinést pouze nominální výsledky v nejlepším případě ve prospěch LOAD DATA INFILE.

Jděte do toho a přidejte to do my.cnf

[mysqld]
bulk_inset_buffer_size=256M

Dalo by se také nastavit právě pro vaši relaci před spuštěním rozšířené INSERTs

SET bulk_insert_buffer_size= 1024 * 1024 * 256;

AKTUALIZACE 2012-07-19 14:58 EDT

Z důvodu udržení perspektivy je vyrovnávací paměť hromadného vkládání užitečná pouze pro načítání tabulek MyISAM, nikoli InnoDB. Napsal jsem novější příspěvek o hromadném načítání InnoDB: Mysql načtení z infile uvíznutého čekání na pevném disk

26
RolandoMySQLDBA

Většina systémů správy databází má zařízení pro hromadné načítání pro rychlé načítání velkých objemů dat. Příkaz INSERT má značné množství zavazadel pro jednotlivé příkazy - zamykání, vymezení transakcí, kontroly referenční integrity, přidělování zdrojů, I/O, které musí být prováděno na základě jednotlivých výpisů.

Hromadné operace vkládání zefektivňují proces, takže tento materiál má mnohem, mnohem méně režii na řádek. DBMS může hromadně načítat datové objednávky velikosti rychleji než prostřednictvím příkazů insert.

Analýza a provádění jednotlivých příkazů INSERT přináší mnohem větší režii, než rozdělení souboru CSV do sloupců a jejich přímé načítání.

Každý příkaz INSERT musí být syntakticky analyzován motorem MySQL a zkontrolována jeho platnost - to vyžaduje další prostředky CPU a také vyžaduje více klientských <> zpátečníky serveru. To se nemusí stát při hromadném načítání pomocí LOAD DATA INFILE. Existují také optimalizace, ke kterým může dojít při použití LOAD DATA INFILE načíst do prázdné tabulky. Další informace viz tento odkaz .

3
Philᵀᴹ