Portál AbcLinuxu, 10. května 2025 16:54

Dotaz: MyISAM vs. InnoDB

15.2.2013 11:10 basss | skóre: 2
MyISAM vs. InnoDB
Přečteno: 8679×
Odpovědět | Admin
Příloha:
Dobrý den

Nenašly by se dobrovolníci ktere by sem napsaly puzivám MyISAM nebo InnoDB a konfiguracni soubor a spokojenost a vyuziti v praxi . (pokud možvno severy s vetsim zatizenim)

Stale ladim sve servery a tunnig prime a mysqltuner me uz prijdou informativni neni neco co by poradilo vic do hloubky.

Zatím používám MyISAM na severu 36GB RAM, 2xXEON CPU 16jader , Fake RAID 10 na HDD 7200 otacek. Server je jen pro DB Mysql 5.5.28 a prubezne aktualizuju

Stale je připojeno asi 300 uzivatelu Nic složiteho select insert 30/70% Snaha je o co nejrychlejsi odpovedi

Možna už jsem zblbej jak to ladim tak bych se rad poucil jak to maji jini Předem děkuju.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.2.2013 12:05 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejsem žena (ani dobrovolník), ale přesto píšu sem:
„puzivám MyISAM nebo InnoDB a konfiguracni soubor a spokojenost a vyuziti v praxi . (pokud možvno severy s vetsim zatizenim) “
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
19.2.2013 18:31 azurIt | skóre: 34 | blog: zatial_bez_mena
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak nepotrebujes full text indexy, tak to skonvertuj na InnoDB.
26.2.2013 23:32 VM
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Odpovědět | | Sbalit | Link | Blokovat | Admin
MyISAM je rychlé, umí fulltext indexy a rychle počítá počty řádek v tabulkách, ale neumí cizí klíče a transakce. InnoDB umí constrainty s cizími klíči a transakce, ale neumí pořádně spočítat počet řádek v tabulce, je o něco pomalejší, a pokud člověk nechce všechny tabulky v jednom souboru, tak se musí upravit konfigurák. Před pár lety jsme přešli z MyISAM na InnoDB, a zatím nelitujeme - přínosy jsou větší než ztráty.
27.2.2013 08:56 karel
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, take sem resil podobny problem s tim abych ze serveru vymackal co se da, nakonec nejvetsi zrychleni prinesl prechod z mysql na mariadb.org Samozrejme zalezi na aplikaci, ale v mem pripade sem pocitil velke zrychleni.
5.3.2013 10:41 Lyco
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Odpovědět | | Sbalit | Link | Blokovat | Admin
TL;DR: vykašli se na MyISAM a používej InnoDB.

Podrobněji: Nenapsal jsi, co přesně na tom chceš provozovat, a jak vypadá zátěž. Píšeš že poměr selectů a insertů je 30:70, to je nějaké divné - skutečně máš dvakrát víc insertů než selectů? Dále nevíme, jestli ti v databázi běhají nějaké dlouhodobější dotazy - generování nějakých reportů, dávkové importy a podobně. Taky by se hodilo vědět něco o struktuře databáze - jsou tabulky normalizované a děláš tím pádem hodně JOINů, nebo je všechno denormalizované? Jsou nějaká data používanější než jiná? Kolik jich je? Jak je databáze velká? (Vejde se do paměti? Vejdou se tam aspoň "horká" data?) Opakují se dotazy, nebo je každý select unikát? Provozuješ na serveru kromě databáze ještě něco, jako třeba webserver? Pokud ano, kolik je statických dat? Kolik máš najednou běžících dotazů (pokud ti tam opravdu běží v jednu chvíli 300 dotazů, tak máš vážný problém).

Než se pustím do nějakého většího rozboru: vykašli se na fakeraid. Pokud nemáš HW řadič, tak použij mdraid. Fakeraid spojuje nevýhody obojího a nepřináší žádný prospěch. RAID 10 je dobrá volba, pokud potřebuješ výkon.

Budu předpokládat následující věci (pokud něco z toho neplatí, pak nemusí platit moje závěry): Databáze je na samostatném serveru. Databázi používá webserver, který si dělá connection pooling. Většina otevřených spojení nic nedělá, v jednu chvíli se vykonává 5 - 20 dotazů. Na serveru se provádí dlouho trvající dotazy, ale jen v noci. Není potřeba je optimalizovat víc než aby kvůli nim server nepadal. V tuhle chvíli server nepadá, takže je můžeme ignorovat. Data se nevejdou do RAM, ale vejdou se tam často používaná data, takže na disk se při běžném provozu sahá jen občas, a jen v jednom nebo dvou vláknech. Databáze je z větší části normalizovaná, řekněme druhá normální forma. Běžné dotazy sahají na jednu až tři tabulky. Na všech sloupcích podle kterých se joinuje jsou indexy. Poměr selectů:zápisů je 30:70, selecty se obvykle příliš neopakují. Z tabulek, do kterých se zapisuje, se taky čte. (Tzn. nemáš "write only" tabulku.) Předpokládám, že umíš optimalizovat dotazy. Tzn. neřeším kam dát jaké indexy, jak a kdy se vyhnout sekvenčním čtením tabulek a podobně.

Protože se ti dotazy moc neopakují, je zbytečné používat query cache, jenom přidává další (globální) zámky. Zkus ji vypnout.

MyISAM je rychlý jen při splnění následující podmínky: do databáze se nezapisuje. Jakmile se začnou střídat čtení a zápisy (na vytíženém serveru stačí klidně 5 % zápisů), výkon prudce klesá, protože se zamykají celé tabulky. Vzhledem k tomu, že ty zapisuješ často, je MyISAM nesmysl. Používej InnoDB, začni pracovat s transakcemi a pokud můžeš, nepoužívej SERIALIZABLE (opět kvůli zamykání). Přechod na InnoDB je nejzásadnější optimalizace.

InnoDB používá vlastní cache. Nastav si innodb_buffer_pool_size na cca 40 - 50 % dostupné RAM. Taky nezapomeň na key_buffer, cca 10 - 20 % RAM. Zbytek nech volný pro souborovou cache operačního systému. Experimentuj. Tohle je druhá nejdůležitější optimalizace.

Pokud potřebuješ výkon a jsi ochotný riskovat malou ztrátu dat, nastav innodb_flush_log_at_trx_commit = 2. Nepoužívej = 0. Tohle je třetí nejdůležitější optimalizace.

Používej EXPLAIN. Používej slow log. Používej pt-query-digest (v Debianu je ještě jako mk-query-digest). Používej indexy na více sloupcích. RTFM.

InnoDB tabulky jsou vlastně indexy, které obsahují kromě primárního klíče i zbytek řádku (tomuhle uspořádání se říká cluster index). Všechny ostatní indexy obsahují indexované sloupce a hodnotu primárního klíče. Pokud v tabulce primární klíč není, InnoDB vytvoří skrytý sloupec a bere ten, ale tenhle sloupec je poměrně velký (6 byte). Aby byly indexy co nejrychlejší, měly by být taky co nejmenší (pak se jich vejde víc do paměti a rychleji se čtou z disku). Proto potřebuješ na každé tabulce primární klíč, a potřebuješ ho co nejkratší (ideálně INTEGER). Pozor, změna primárního klíče znamená, že se musí tabulka postavit úplně znova.

InnoDB je optimalizované na režim, kdy jsou data všech tabulek v jednom souboru. Bohužel, InnoDB neumí svoje datové soubory zmenšovat (se zvětšováním nemá problém). Nech si dost místa na disku. Dávej si pozor, abys do databáze nenasypal spoustu data která pak budeš mazat - místo by se neuvolnilo.

Pokud potřebuješ fulltext, vykašli se na MySQL. Použij třeba elasticsearch nebo sphinx. MySQL má fulltext který je pomalý, nic neumí a nedá se konfigurovat.

Vyhni se počítání řádků (count(*)). Protože je InnoDB transakční, musí přečíst každý řádek jen aby vědělo, jestli ho transakce vidí. Pokud ti stačí přibližná data, vezmi je z information_schema. Pokud potřebuješ přesná, omez důkladně počet řádků které se musí přečíst (tzn. musíš tam mít index).

InnoDB nemá stabilní statistiky jako MyISAM, místo toho dělá random dives (http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html#idp100219904). Výsledky EXPLAINu se můžou měnit samy od sebe. Pouštěj EXPLAIN víckrát a dělej mezi tím ANALYZE TABLE.
iwtu avatar 5.3.2013 20:26 iwtu | skóre: 7 | blog: Personal Wiki
Rozbalit Rozbalit vše Re: MyISAM vs. InnoDB
Zdravim. Vas prehlad o databazach mi pride super. Nevenujem sa im vobec, beriem ich ako nutne zlo, ale k vedomostiam, o ktorych hovorite, teda ako skutocne narabat s databazou efektivne... som sa nikde nedostal.

Prosim, nemate o nich niekde blog? Bolo by to pre prehlad nesmierne uzitocne. Dakujem za pripadnu odpoved.

Ja by som uz dnes zvolil MariaDB alebo PostgreSQL, ak sa bavime o relacnych databazach.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.