Nevýhody InnoDB oproti MyISAM v MariaDB

Nevýhody InnoDB oproti MyISAM v MariaDB
« kdy: 16. 04. 2025, 10:24:46 »
Jaké má výhody inodb oproti myisam se píše všude možně.
Nyní se testuji přechod na myisam a nárážím na podstatné nevýhody inodb, o který se ale téměř nikdo nezmiňuje.

Začal jsem tím, že pomocí mysqldump jsem provedl export databáze.
Import ale netrval cca dvě hodiny jako u myisam, ale celý víkend.

Problém je v tom, že inodb nepodporuje ALTER TABLE DISABLE KEYS, které použije mysqldump pro zrychlení importu.

To že  ALTER TABLE DSIBLE KEYS funguje jen na zastaralé myisam je jaksi špatně zdokumentováno jen tak mimochodem, jako by to bylo něco nepodstatného.

Výsledek je že se updatují klíče po každém INSERT, což operaci hrozně zpomaluje a ničí se při tom disky. 

Zrychlit import  lze také provedením příkazů před importem:

Kód: [Vybrat]
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

Po importu
Kód: [Vybrat]
COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

Dobré řešení je vytvořit tabulku bez indexů. Nalít tam data a indexy vytvořit až úplně nakonec.
Ale zdá se takový postup mysqldump nepodporuje a nezbývá než ručně editovat SQL příkazy, aby se indexy vytvořili až po importu. Což je krajně nepohodlné.
Existuje nějaký elegantnější způsob jak obnovit databázi ze zálohy, aby se rychlost alespoň řádově blížila běžné rychlosti tabulek myisam?

Překvapuje mne, že mysqldump nemá na takové použitý vůbec volby. A nemá volby ani na to, aby každou tabulku ukládal do jiného souboru (strukturu a data zvlášť), aby bylo možné ruční zásahy dělat snadněji.

Jaké další nevýhody a nedodělky má inodb o kterých se běžně nepíše?

Existuje něco lepšího než mysqldump, který by lépe pracoval s nedostatky inodb?

Předpokládám, že nikdo nechce čekat desítky minut nebo dokonce dny na obnovení databáze ze zálohy na novém stroji úplně zbytečně.


CPU

  • *****
  • 1 054
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #1 kdy: 16. 04. 2025, 11:41:01 »
Pffff ....představa, že se ve dvě ráno hrabu v databázi, aby se vůbec stihl import, mě docela děsí...

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #2 kdy: 16. 04. 2025, 12:03:54 »
existuje, replikace, např. galera a wsrep, obnova databáze trvá tak rychle jak jsme schopní na disk nalít data, tj. v našem případě rychlostí 3 GB/s. Backupy jsou pak kontinuální.

Mysqldump a import přes sql jsem neřešil roky. Používali jsme vždy bulk query, vypnout contraints je sice super, ale hodí se to jen tehdy, když importuješ do prázdných tabulek.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #3 kdy: 16. 04. 2025, 12:46:49 »
Máme replikaci master-slave. Na master používáme zatím myisam. Chci přejít na inodb. Takže jsme provedli export přes mysqldump s tím, že import provedeme do inodb (používá se tam partitiong - funguje to jinak než v myisam) a dále pustíme replikace, aby se myisam ve zkušební době replikovala do inodb a mohlo se nanečisto vyzkoušet.
Vypadá, že s tím není problém a budeme tak mít možnost si vyzkoušet právi s inodbt a přesvědčit se, že např. nepoužíváme nějaké dotazy, které by byly na inoddb výrazně pomalejší.
Záloha by měla stačit přes zfs snapshot, ale mít možnost zálohu vytvořit a obnovení provést pomoci mysqdump jsem považoval také za dobré. Např. pro přechod na mnohem novější verzi databáze a podobně si člověk netahá s sebou možné náhodné chyby na binární úrovni. Prostě začít úplně nanovo. Ale není to moc použitelné, je třeba do toho ručně zasahovat, aby se obešli z mého pohledu nedokonalosti inodb. Např. ani nemohu obrovskou tabulku importovat v jednom kroku, nebo se mariadb úplně kousne. Po měsících to jde, ale trvá to moc dlouho, takže se to musí ručně optimalizovat.

Ideálně bychom potřebovali něco jako mysqldump, která ale bude podporovat manýry inodb.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #4 kdy: 16. 04. 2025, 13:23:14 »
Replikace databáze myIsam -> InoDB už běží.   Pokud replikaci zastavíme, má co dělat, aby to vůbec dohnala. Tedy pro zápis je pomalejší na stejném hardware s defaultním nastavením řádově tak 80 krát oproti myIsam.  Zabíjí to hlavně ty commity po každé transakci. Upravím nastavení innodb a dám vědět jak se to zlepšilo.

Že je jen přechodem z myIsam na InnoDB dosáhnout řádově až 100 násobné zpomalení zápisů, je pro mne také překvapující. Nikdo z těch co porovnávali  innoDB s MyIsam to nezmínil. Předpokládám ale, že to půjde vyladit.  Na replice by nám mohl stačil commit klidně jednou za 5 vteřin, ale není jisté jestli se to dá až takto nastavit.


Wasper

  • ***
  • 166
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #5 kdy: 16. 04. 2025, 13:28:16 »
Začal jsem tím, že pomocí mysqldump jsem provedl export databáze.
Import ale netrval cca dvě hodiny jako u myisam, ale celý víkend.
Koukněte na mariadb-backup popř. xtrabackup z Percony - používat mysqldump na zálohu čehokoliv většího než blogííííšek je docela hardcore.

BTW ten problém s klíči není kvůli tomu, že innodb je hloupá, ale že na rozdíl od myisam je transakční, takže si nemůže dovolit čuňárny, které používá právě mysqldump k urychlení importu. Binární backupy/restore tohle řeší.

mhepp

  • ***
  • 181
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #6 kdy: 16. 04. 2025, 13:52:58 »
Tady může být jiné úzké hrdlo - ZFS je přece COW filesystém. Zkusil bych COW vypnout pro databázi, je-li to možné.

Nepíšeš ještě jak veliká ta DB je a jak rychle se zapisuje. Měl jsem různě veliké DB s InnoDB a replikací - jedině, kdy to déle trvalo bylo dohnání master na začátku, pak nebyl problém.

RDa

  • *****
  • 2 911
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #7 kdy: 16. 04. 2025, 15:02:03 »
Vypadá, že s tím není problém a budeme tak mít možnost si vyzkoušet právi s inodbt a přesvědčit se, že např. nepoužíváme nějaké dotazy, které by byly na inoddb výrazně pomalejší.

A jak zjistujete kolik ktery dotaz trva? Jako jiste, lze to logovat na aplikacni vrstve, nez to vleze do konektoru, ale.. ten netusi nic o vytizeni DB a zda je tam s dotazem sam, nebo se jich tam provadi paralelne stovka, takze tento zpusob muze/bude produkovat false positives.

Logik

  • *****
  • 1 046
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #8 kdy: 16. 04. 2025, 17:21:26 »
A když už do toho hrabete, nechcete to předělat rovnou na postgresql?

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #9 kdy: 16. 04. 2025, 23:03:36 »
Po přidání následujících hodnot do server.cnf je rychlost zápisu do innoDB tabulky srovnatelná s rychlostí u myISam s defaultním nastavením.
Kód: [Vybrat]
innodb_file_per_table = ON
innodb_doublewrite = 0
innodb_flush_log_at_trx_commit = 2
innodb_flush_log_at_timeout = 5
innodb_buffer_pool_size = 42949672960

thread_stack = 256K

sync-binlog = 0

Je rychlost zápisu velmi podobná jako u myISAM.  Tedy další špatně dokumentovaná nevýhoda innoDB je, že defaultní nastavení je mnohonásobně pomalejší pro zápis, což je ale možné vyladit vhodným nastavením.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #10 kdy: 16. 04. 2025, 23:16:37 »
Vypadá, že s tím není problém a budeme tak mít možnost si vyzkoušet právi s inodbt a přesvědčit se, že např. nepoužíváme nějaké dotazy, které by byly na inoddb výrazně pomalejší.

A jak zjistujete kolik ktery dotaz trva? Jako jiste, lze to logovat na aplikacni vrstve, nez to vleze do konektoru, ale.. ten netusi nic o vytizeni DB a zda je tam s dotazem sam, nebo se jich tam provadi paralelne stovka, takze tento zpusob muze/bude produkovat false positives.

Já to měřím jinak.  Databáze s innoDB replikuje všechny zápisy na hlavní databázi, která má stále MyIsam.
Pokud chci měřit to, jak rychle fungují zápisy na clonu, tak clonování zastavím třeba na deset minut.
Po  deseti minutách klonování opět rozjedu a sleduji jak rychle slave dohání master databázi.
Slave v závislosti na svém nastavení a rychlosti fungování zápisů je schopen za jednu vteřinu skutečného času dohnat 0-150 vteřin.  V nejhorším případě se zpoždění dále zhoršuje, protože replika nestíhá. V nejlepším případě za 1 vteřinu dožene 150 vteřin skutečných zápisů. Tedy 10 minut dožene za cca 4 vteřiny.

Měřím tak jen rychlost zápisů, nikoli čtení. A samozřejmě musím brát v potaz dobu, kdy měření provádím, např. v noci je zápisů na hlavní databází méně, takže to nemohu porovnávat s počtem zápisů např. ve všední den dopoledne.

Tímto způsobem mohu měřit množství zapsaných dat na disk a tedy i opotřebení SSD disků a jak se to mění s různou konfigurací jak ZFS tak databáze samotné. Při špatném nastavení je možné méně kvalitní SSD disky zničit za jediný rok, při dobrém nastavení jsou to teoreticky až desítky let.
V reálném čase mohu porovnávat množství zapsaných dat dvou různých replik hlavní databáze s různou konfigurací.

Wasper

  • ***
  • 166
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #11 kdy: 16. 04. 2025, 23:20:30 »
Je rychlost zápisu velmi podobná jako u myISAM.  Tedy další špatně dokumentovaná nevýhoda innoDB je, že defaultní nastavení je mnohonásobně pomalejší pro zápis, což je ale možné vyladit vhodným nastavením.
Nezlobte se, ale to není ani nevýhoda, ani špatně dokumentovaná. Možná před pokusy byste si měl přečíst alespoň tohle https://dev.mysql.com/doc/refman/8.4/en/mysql-acid.html
To, co jste udělal je, že jste v podstatě vypnul integritu nad databází, kterou InnoDB nabízí (přesnější popis najdete v dokumentaci).

Asi něco (velmi volný příklad) podobného, jako kdybyste u diskového pole zapnul zápisovou cache bez baterky, a stěžoval si, že pole bez toho zapisuje pomalu.

Wasper

  • ***
  • 166
    • Zobrazit profil
    • E-mail
Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #12 kdy: 16. 04. 2025, 23:31:12 »

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #13 kdy: 16. 04. 2025, 23:32:53 »
A když už do toho hrabete, nechcete to předělat rovnou na postgresql?
O tom jsem přemýšlel. Ale pokud vím postgreSQL vyniká hlavně  v konzistenci a pokročilém použití. Já spíše potřebuji jen hrubou rychlost a funkčnost 24/7 na což postgreSQL zas tak dobrý není. Pokud by se mi ztratil náhodně jeden záznam z milionu, netrápí mne to. Stejně tak mne netrápí kdybych např. při výpadku elektřiny (počítám že by se mohlo přihodit jednou za 10 let) přišel třeba o 20 vteřin dat. Naopak kdybych musel někdy v noci opravovat či optimalizovat nějakou tabulku třeba půl hodiny a proto ji uzamčít, je to velký problém.
A taky se mi nechce učit nic nového, když vlastně nevím jestli bych si vůbec polepšil. Spíše nikoli.

Od MyISam odcházím z toho důvodu, že zápisy blokují následující čtení.    Tedy pokud bych měl dva delší selecty, mohou probíhat paralelně bez problémů, pokud mezi nimi nebyl žádný zápis. Ale pokud v okamžiku delšího selectu přijde zápis, tak ten čeká na dokončení selectu. A následující select zase čeká na dokončení toho zápisu, takže se to celé ucpe jen kvůli jednomu delšímu selectu.  To by mělo innodb vyřešit.  Pokud by ale existovala možnost nastavit u MyIsam, že má zápis menší prioritu než čtení a zápis by čekal až na okamžik, kdy není žádný požadavek na čtení, mohli bychom dále používat myIsam. Zápis je totiž  v našem případě vždy rychlý. Ale bohužel změnit tu prioritu se mi nepovedlo.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #14 kdy: 16. 04. 2025, 23:47:11 »
Je rychlost zápisu velmi podobná jako u myISAM.  Tedy další špatně dokumentovaná nevýhoda innoDB je, že defaultní nastavení je mnohonásobně pomalejší pro zápis, což je ale možné vyladit vhodným nastavením.
Nezlobte se, ale to není ani nevýhoda, ani špatně dokumentovaná. Možná před pokusy byste si měl přečíst alespoň tohle https://dev.mysql.com/doc/refman/8.4/en/mysql-acid.html
To, co jste udělal je, že jste v podstatě vypnul integritu nad databází, kterou InnoDB nabízí (přesnější popis najdete v dokumentaci).

Asi něco (velmi volný příklad) podobného, jako kdybyste u diskového pole zapnul zápisovou cache bez baterky, a stěžoval si, že pole bez toho zapisuje pomalu.

Já ACID nepotřebuji. Proto jsem tak dlouho zůstal u MyIsam. A nyní se ukazuje, že InnoDB umí velkou část těch dobrých  věcí jen za cenu podstatné snížení rychlosti zápisů. Ale naštěstí to jde vypnout a tím tuto  špatně dokumentovanou nevýhodu innodB  (pomalost zápisů) eliminovat. Všichni ti co píší o výhodách InnoDB zapomínají zmínit, že je to  za cenu pomalejších zápisů. Ale lze najít vhodný kompromis nastavením.
Z vlastností innoDB potřebuji jen to, aby zápisy nečekaly na dokončení předchozího čtení a následující čtení zase na dokončení předchozích zápisů. Zápisy jsou obecně rychlé, ale v myIsam čekají na dokončení předchozího čtení. Tedy jeden náročnější select dovede zamčít celou tabulku pro všechny operace, pokud se v jeho průběhu vyskytne nějaký zápis.