-170 komentáře “Import velkých dat do MySQL

  1. Ponechme slovíčkaření stranou. Typický usecase, který řešíme zas a znovu je ruční import dat z externí uživatelské DB, kterou má zákazník vyexportovanou ve formě CSV nebo Excelu. On demand import, který si zákazník dělá sám, typicky neobsahuje milióny záznamů (ještě jsem to ve své praxi neviděl), ale řádově desetitisíce nebo stotisíce záznamů (jen formát XLS množství výrazně omezuje s omezením 65 tis. záznamů na jeden list). Tím že je to on demand, musí bý v aplikaci rutina, která import provádí a tu píšeme pomocí insertů přes JDBC.

    Máš pravdu, že pokud bych měl import o 10 mil. záznamech, tak bych to řešil specifickým importem ze strany dodavatele přímo nástroji, které se k DB dodávají. Tenhle problém tu ale neřeším.

    Btw. kupodivu jsem nezaznamenal výraznou úsporu času vypnutím constraint.

  2. Par pripominek:
    Import velkych dat neni o stotisicich ale milionech.
    Clanek neni o rychlosti importu, ale rychlosti insertu.
    Import dat pres inserty je sebevrazda. 😉
    Kdyz uz importuju pres inserty, tak si zavislosti behem operace vypinam. Pokud se chci dozvedet o nekonzistenci dat – tak je to dobre vyresit mimo import – pred nebo potom.

  3. Upravil jsem text článku podle toho, na co jsi Maaartine upozorňoval – skutečně ta MyISAM nevychází o moc líp než InnoDB. Já jsem původně porovnával časy na všechny testy ve třídě, jenže tam se hrozně projevila neefektivita InnoDB v autocommit režimu, z čehož jsem vyvodil špatný závěr. Dík za upozornění – kupodivu tedy MyISAM není výrazně rychlejší a to zmiňované doporučení jsem odstranil. Prostě víc očí víc vidí.

  4. Pravda je, že InnoDB v transakci dosahuje podobných výsledků jako MyISAM – taky jsem do těch výsledků čučel pozdě v noci. Tj. možná to s tou MyISAM není zase až o tolik výhodnější jak s InnoDB.

    Data tam cpu z Javy přes Springovou podporu executeBatch – tj. asi nejrychlejší způsob, který jsem dokázal vymyslet. Pouze pro otestování LOAD DATA INFILE jsem si vytvořil externí TXT file, který jsem potom funkci předhodil (tam to snad ani nijak jinak nejde). Nejlíp když se koukneš rovnou do testovacího kódu.

  5. Naxem jsem nepochopil jesti tam cpes data z Javy nebo z SQL-souboru. Pokud ze souboru, taxe divim ze se ti ho chtelo vytvaret (mnohem vic prace nez pro LOAD DATA INFILE), pokud z Javy taxe divim ze nepises o pouziti PreparedStatement-s ci o executeBatch.

    Super, zes udelal takovyhle prehled, ale s necim moc nesouhlasim:

    „preferujte MyISAM před InnoDB“ – MyISAM je stary netransakcni srot. Sice rychly, ale kdyz se rozsype, tak je vymalovano. Kdyz zjistis ze transakce ci jiny ficurky vznikly po roce nula prece jen potrebujes, pak muzes nejen pracne presypavat data, ale mas zadelano na hafo problemu. Rekl bych to naopak: Kdyz potrebujes rychlost, jen rychlost a to extemne moc, pak MyISAM.

    Me navic Tvoje vysledky pro InnoDB prijdou zhruba stejny jako pro MyISAM: Kdyz se to dela dobre, pak oboje je pod 20s; mozna ale spatne vidim, uz je dost pozde.

  6. Faktem je, že když jsem si cvičně implementoval metodu, která LOAD DATA INFILE využívá, tak si dokážu docela dobře představit i produkční využití. Ono to zase tak pracné není, jak jsem si původně myslel.

  7. On je to vždy kompromis : )
    Osobně jsem LOAD DATA IN FILE používal pouze při importech do jedné tabulky, nebo když těch dat bylo opravdu hodně, pak už se vynaložené úsilí při přípravě dat vyplatí.

  8. Tak jsem dopsal poslední test – skutečně funkce Load data infile vychází ve výkonnostních statistikách nejlépe. Když jsem nad tím přemýšlel, asi by bylo možné tu naši logiku implementovat v předstihu a do souboru ukládat už vypočtená data. Provázání klíčů by se dalo řešit dodatečnými selecty, ve kterých by se dotáhly přidělené primární klíče pro importované záznamy (do tabulky totiž mohou v našem případě konkurentně přistupovat i další uživatelé, takže fixní hodnoty primárních klíčů nepřipadají v úvahu). Rozhodně by to asi za tu námahu stálo, kdybychom tahle čísla věděli už na začátku. Každopádně jsme teď chytřejší.

    Lukáši, díky za komentář.

  9. Asi by to neměl být problém. My jsme řešili úlohu importu dat z Excelu a šli jsme nejjednodušší možnou cestou. Navíc jsme při importu potřebovali aplikovat i nějakou logiku, která by při Load data in file nebylo možné.