it-swarm-eu.dev

Jaké jsou hlavní rozdíly mezi InnoDB a MyISAM?

Jaké jsou hlavní rozdíly mezi InnoDB a MyISAM?

255
ilhan

První velký rozdíl vidím v tom, že InnoDB implementuje zámek na úrovni řádku, zatímco MyISAM může provádět pouze zámek na úrovni tabulky. Lepší zotavení po havárii najdete v InnoDB. Do indexu v5.6 však nemá FULLTEXT vyhledávací indexy, stejně jako MyISAM. InnoDB také implementuje transakce, cizí klíče a omezení vztahů, zatímco MyISAM ne.

Seznam může jít ještě dále. Přesto mají oba své jedinečné výhody ve svůj prospěch i nevýhody vůči sobě navzájem. Každá z nich je v některých scénářích vhodnější než druhá.

Takže shrnout (TL; DR):

  • InnoDB má zamykání na úrovni řádku, MyISAM může provádět pouze zamykání na úrovni celé tabulky.
  • InnoDB má lepší zotavení po havárii.
  • MyISAM má FULLTEXT indexy vyhledávání, InnoDB ne dříve, než MySQL 5,6 (únor 2013).
  • InnoDB implementuje transakce, cizí klíče a omezení vztahů, MyISAM ne.
165
poelinca

Dalším velkým rozdílem, který dosud není uveden, je způsob ukládání do mezipaměti pro každý úložný stroj.

[~ # ~] myisam [~ # ~]

Hlavním používaným mechanismem je mezipaměť klíčů. Ukládá pouze mezipaměti indexových stránek ze souborů .MYI. Chcete-li velikost mezipaměti klíčů, spusťte následující dotaz:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Tím získáte doporučené nastavení pro klíčovou mezipaměť MyISAM ( key_buffer_size ) vzhledem k aktuální sadě dat ( dotaz) omezí doporučení na 4G (4096M). Pro 32bitový operační systém je limit 4 GB. Pro 64bitový 8GB.

InnoDB

Hlavním použitým mechanismem je fond vyrovnávacích pamětí InnoDB. Ukládá do mezipaměti data a indexové stránky z přístupových tabulek InnoDB. Chcete-li velikost fondu vyrovnávacích pamětí InnoDB, spusťte následující dotaz:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;

Tím získáte doporučené nastavení pro velikost rezervy vyrovnávacích pamětí InnoDB ( innodb_buffer_pool_size ) vzhledem k aktuální sadě dat.

Nezapomeňte změnit velikost souborů protokolu InnoDB (ib_logfile0 a ib_logfile1). Zdrojový kód MySQL umisťuje omezení kombinovaných velikostí všech souborů protokolu InnoDB musí být <4G (4096M). Kvůli jednoduchosti je vzhledem k dvěma souborům protokolu možné tyto velikosti změnit:

  • Krok 1) Přidejte innodb_log_file_size = NNN do /etc/my.cnf (NNN by mělo být 25% innodb_buffer_pool_size nebo 2047M, podle toho, co je menší)
  • Krok 2) service mysql stop
  • Krok 3) rm /var/log/mysql/ib_logfile[01]
  • Krok 4) service mysql start (ib_logfile0 a ib_logfile1 jsou znovu vytvořeny)

[~ # ~] upozornění [~ # ~]

Na konci obou dotazů je vložený dotaz (SELECT 2 PowerOf1024) B

  • (SELECT 0 PowerOf1024) dává Nastavení v bajtech
  • (SELECT 1 PowerOf1024) dává Nastavení v kilobajtech
  • (SELECT 2 PowerOf1024) dává Nastavení v megabajtech
  • (SELECT 3 PowerOf1024) dává Nastavení v Gigabajtech
  • Nejsou přijímány žádné pravomoci menší než 0 nebo vyšší než 3

[~ # ~] epilog [~ # ~]

Neexistuje náhrada zdravého rozumu. Pokud máte omezenou paměť, směs paměťových modulů nebo jejich kombinaci, budete muset upravit různé scénáře.

  • Pokud máte 2 GB RAM a 16 GB InnoDB), přidělte 512M jako innodb_buffer_pool.
  • Pokud máte 2 GB RAM a 4 GB indexů MyISAM), přidělte 512M jako velikost key_buffer_size.
  • Pokud máte 2 GB RAM a 4 GB indexů MyISAM a 16 GB InnoDB, přidělte 512M jako key_buffer_size a 512M jako innodb_buffer_pool_size.

Možné scénáře jsou nekonečné !!!

Nezapomeňte, ať už přidělíte cokoli, ponechte dost RAM pro připojení DB a operační systém).

89
RolandoMySQLDBA

InnoDB nabízí:

  • Transakce ACID
  • zamykání na úrovni řádku
  • omezení cizího klíče
  • automatické zotavení po havárii
  • komprese tabulky (čtení/zápis)
  • typy prostorových dat (bez prostorových indexů)

V InnoDB mohou všechna data v řadě kromě TEXT a BLOB obsadit maximálně 8 000 bytů. Indexování úplného textu není v InnoDB k dispozici až do MySQL 5,6 (únor 2013). V InnoDB se funkce COUNT(*) s (když WHERE, GROUP BY Nebo JOIN nepoužívá) provádí pomaleji než v MyISAM, protože počet řádků není interně uložen . InnoDB ukládá data i indexy do jednoho souboru. InnoDB používá fond vyrovnávacích pamětí k mezipaměti dat i indexů.

MyISAM nabízí:

  • rychlý COUNT(*) s (když WHERE, GROUP BY nebo JOIN není použito)
  • fulltextové indexování (aktualizace: podporováno v InnoDB z MySQL 5.6)
  • menší rozměr disku
  • velmi vysoká komprese stolu (pouze pro čtení)
  • typy a indexy prostorových dat (R-strom) (aktualizace: podporováno v InnoDB z MySQL 5.7)

MyISAM má zamykání na úrovni tabulky, ale žádné zamykání na úrovni řádků. Žádné transakce. Žádné automatické zotavení po havárii, ale nabízí funkčnost tabulky oprav. Žádné omezení cizího klíče. Tabulky MyISAM jsou obecně kompaktnější na disku ve srovnání s tabulkami InnoDB. Tabulky MyISAM lze v případě potřeby dále výrazně zmenšit komprimací pomocí myisampack, ale staly se pouze pro čtení. MyISAM ukládá indexy do jednoho souboru a data do jiného. MyISAM používá klíčové vyrovnávací paměti pro ukládání indexů do mezipaměti a ponechává správu ukládání dat do mezipaměti na operační systém.

Celkově bych doporučil InnoDB pro většinu účelů a MyISAM pouze pro specializovaná použití. InnoDB je nyní výchozím motorem v nových verzích MySQL.

63
dabest1

Trochu pozdě do hry ... ale tady je docela komplexní příspěvek, který jsem napsal o pár měsíců zpět , podrobně uvádějící hlavní rozdíly mezi MYISAM a InnoDB. Popadněte cuppa (a možná i sušenku) a užívejte si.


Hlavní rozdíl mezi MyISAM a InnoDB spočívá v referenční integritě a transakcích. Existují také další rozdíly, jako je zamykání, vrácení zpět a fulltextové vyhledávání.

Referenční integrita

Referenční integrita zajišťuje, že vztahy mezi tabulkami zůstávají konzistentní. Konkrétně to znamená, že pokud tabulka (např. Výpisy) obsahuje cizí klíč (např. ID produktu) směřující na jinou tabulku (např. Produkty), když dojde k aktualizaci nebo vymazání tabulky s odkazem na tabulku, jsou tyto změny kaskádovány k propojení stůl. V našem příkladu, pokud je produkt přejmenován, aktualizují se také cizí klíče propojovací tabulky; Pokud je produkt odstraněn z tabulky „Produkty“, budou odstraněny také všechny záznamy, které odkazují na odstraněný záznam. Kromě toho musí mít každý nový zápis cizí klíč, který ukazuje na platný existující záznam.

InnoDB je relační DBMS (RDBMS) a má tedy referenční integritu, zatímco MyISAM nikoli.

Transakce a atomicita

Data v tabulce jsou spravována pomocí příkazů Data Manipulation Language (DML), jako je SELECT, INSERT, UPDATE a DELETE. Transakční skupina dva nebo více příkazů DML společně do jedné jednotky práce, takže je použita celá jednotka nebo žádný z nich není.

MyISAM nepodporuje transakce, zatímco InnoDB ano.

Pokud je operace přerušena při používání tabulky MyISAM, operace je okamžitě přerušena a ovlivněné řádky (nebo dokonce data v každém řádku) zůstanou ovlivněny, i když operace nebyla dokončena.

Pokud je operace přerušena při používání tabulky InnoDB, protože používá transakce, které mají atomicitu, žádná transakce, která nebyla dokončena, se neprojeví, protože nedojde k žádnému potvrzení.

Uzamčení stolu vs Uzamčení řádku

Když se dotaz spustí proti tabulce MyISAM, bude uzamčena celá tabulka, ve které je dotazován. To znamená, že následné dotazy budou provedeny až po dokončení aktuálního dotazu. Pokud čtete velkou tabulku a/nebo dochází k častým operacím čtení a zápisu, může to znamenat obrovské množství nevyřízených dotazů.

Když se dotaz spustí proti tabulce InnoDB, uzamknou se pouze příslušné řádky, zbytek tabulky zůstane k dispozici pro operace CRUD. To znamená, že dotazy mohou být spuštěny současně ve stejné tabulce za předpokladu, že nepoužívají stejný řádek.

Tato funkce v InnoDB je známá jako souběžnost. Stejně jako souběžnost je hlavní nevýhoda, která se vztahuje na vybraný rozsah tabulek, v tom, že existuje přepětí mezi vlákny jádra, a měli byste nastavit omezení vláken jádra, abyste zabránili zastavení serveru. .

Transakce a vrácení peněz

Při spuštění operace v MyISAM jsou změny provedeny; v InnoDB lze tyto změny vrátit zpět. Nejběžnější příkazy používané k řízení transakcí jsou COMMIT, ROLLBACK a SAVEPOINT. 1. COMMIT - můžete napsat více operací DML, ale změny budou uloženy pouze po provedení COMMIT 2. ROLLBACK - můžete zahodit všechny operace, které dosud nebyly potvrzeny. 3. SAVEPOINT - nastaví bod v seznamu operace, ke kterým lze operaci ROLLBACK vrátit

Spolehlivost

MyISAM nenabízí žádnou integritu dat - Selhání hardwaru, nečisté vypnutí a zrušené operace mohou způsobit poškození dat. To by vyžadovalo úplnou opravu nebo nové sestavení indexů a tabulek.

Na druhou stranu InnoDB používá transakční protokol, vyrovnávací paměť s dvojitým zápisem a automatické kontrolní součet a ověření, aby se zabránilo poškození. Než InnoDB provede jakékoli změny, zaznamená data před transakcemi do systémového souboru tabulkového prostoru nazvaného ibdata1. Pokud dojde ke zhroucení, InnoDB se automaticky obnoví prostřednictvím přehrání těchto protokolů.

FULLTEXT Indexování

InnoDB nepodporuje FULLTEXT indexování, dokud MySQL verze 5.6.4. V době psaní tohoto příspěvku je verze MySQL mnoha poskytovatelů sdílených hostingů stále pod 5,6,4, což znamená, že indexování FULLTEXT není pro tabulky InnoDB podporováno.

Toto však není platný důvod k použití MyISAM. Nejlepší je přejít na poskytovatele hostingu, který podporuje aktuální verze MySQL. Ne, že tabulka MyISAM používající indexování FULLTEXT nemůže být převedena na tabulku InnoDB.

Závěr

Závěrem lze říci, že váš výchozí úložný modul by měl být InnoDB. Vyberte MyISAM nebo jiné datové typy, pokud slouží konkrétní potřebě.

32
d4nyll

Ještě jedna věc: tabulky InnoDB můžete zálohovat pouhým pořízením snímku souborového systému. Zálohování MyISAM vyžaduje použití mysqldump a není zaručeno, že bude konzistentní (např. Pokud vložíte do nadřazené a podřízené tabulky, můžete v záloze najít pouze řádek podřízené tabulky).

V zásadě pokud máte další kopii dat a ukládáte je pouze do mezipaměti v MySQL, např. povolit standardní způsob přístupu k němu z webu PHP=), je MyISAM v pořádku (tj. je lepší než plochý soubor CSV nebo soubor protokolu pro dotazování a souběžný přístup). Pokud je databáze skutečná "hlavní kopie" dat, pokud děláte INSERT a UPDATE s použitím reálných dat od uživatelů, pak je pošetilé používat cokoli jiného než InnoDB, v jakémkoli měřítku MyISAM je nespolehlivé a těžko spravovatelné, budete dělat myisamchk polovinu času, negovat jakékoli zvýšení výkonu ...

(Moje osobní zkušenost: 2 terabajt DB v MyISAM).

31
Gaius

Podle mých zkušeností je nejvýznamnějším rozdílem způsob, jakým každý motor pracuje se zamykáním. InnoDB používá zamykání řádků, zatímco MyISAM používá zamykání tabulek. Zpravidla používám InnoDB pro psaní těžkých tabulek a MyISAM pro čtení těžkých tabulek.

Mezi další důležité rozdíly patří:

  1. InnoDB podporuje transakce a cizí klíče. MyISAM ne.
  2. MyISAM používá fulltextové indexování.
  3. MyISAM provádí špatnou práci při prosazování integrity dat.
19
bsoist

Mám sklon prohlížet MyISAM jako 'výchozí' výběr tabulky pro MySQL, takže poukážu na rozdíly pro většinu uživatelů InnoDB

  • Řádková úroveň zamykání
  • Vymáhání cizího klíče
  • Podpora transakcí
  • Výkonnost u vysoce používaných systémů
9
Patrick

Zahrnuje změny MySQL 5.6

INNODB SKLADOVACÍ MOTOR:

  • Poskytuje plnou ACID (atomicitu, konzistenci, izolaci, trvanlivost). Multi-verze se používá k izolaci transakcí od sebe.
  • InnoDB poskytuje automatické zotavení po zhroucení serveru MySQL nebo hostitele, na kterém je server spuštěn.
  • InnoDB podporuje cizí klíče a referenční integritu, včetně kaskádových vymazání a aktualizací.
  • MySQL 5.6 staví na platformě InnoDB plně integrovaného jako výchozí paměťový modul
  • Statistiky trvalého optimalizátoru: Poskytuje zlepšenou přesnost statistik indexu InnoDB a konzistenci při restartování MySQL.
  • Prořezávání mezipaměti tabulky InnoDB: InnoDB nyní uvolňuje paměť spojenou s otevřenou tabulkou, aby se usnadnilo zatížení paměti u systémů s velkým počtem tabulek. Algoritmus LRU vybere tabulky, které odešly nejdéle bez přístupu.
  • Podporuje fulltextové vyhledávání: Speciální druh indexu, index FULLTEXT, pomáhá InnoDB řešit dotazy a operace DML zahrnující textové sloupce a slova, která obsahují. Tyto indexy jsou fyzicky reprezentovány jako celé tabulky InnoDB.
  • Zdá se, že InnoDB je při fulltextovém vyhledávání mnohem rychlejší než MyISAM

Pokud tedy již máte upgradovaný na 5,6, nemá smysl používat MyISAM Engine, pokud ne, pak nečekejte na upgrade na MySQL 5.6.

InnoDB VS MyISAM výkon pomocí MySQL 5.6

6
Mahesh Patil

MYISAM

MYISAM poskytuje zamykání na úrovni tabulky, FULLTEXT vyhledávání. MYISAM má nejflexibilnější sloupec AUTO_INCREMENTED, který zpracovává všechny úložné stroje. MYISAM nepodporuje transakce.

INNODB

INNODB je transakce bezpečné úložiště motoru. INNODB má možnosti odevzdání, vrácení a zotavení po havárii. INNODB podporuje referenční integritu cizího klíče.

6
Anto

MyISAM

MyISAM je úložný stroj pro MySQL. Před MySQL 5.5 to byl výchozí paměťový modul pro MySQL. Je založen na starší ISAM paměťový modul. MyISAM je optimalizován pro prostředí s těžkými operacemi čtení a málo zápisů nebo vůbec žádné. Důvod, proč MyISAM umožňuje rychlé čtení, je struktura jeho indexy: každá položka ukazuje na záznam v datovém souboru a ukazatel je odsazen od začátku souboru. Takto lze záznamy rychle číst, zejména když je formát FIXED. Řádky tedy mají konstantní délku. typická oblast, ve které by se dalo preferovat MyISAM, je datový sklad, protože zahrnuje dotazy na velmi velkých tabulkách a aktualizace takových tabulek se provádí, když se databáze nepoužívá (obvykle v noci). Vložky jsou také snadné, protože nové řádky jsou připojeny na konec datového souboru. Operace smazání a aktualizace jsou však problematičtější: vymazání musí ponechat prázdné místo, jinak by se posuny řádků změnily; totéž platí pro aktualizace, protože délka řádků se zkracuje; Pokud aktualizace prodlouží řádek, řádek je fragmentován zadejte řádky a nárokujte prázdné místo, OPTIMIZE TABLE musí být proveden příkaz. Kvůli tomuto jednoduchému mechanismu jsou obvykle statistiky indexu MyISAM docela přesné. Další hlavní nevýhody MyISAMu jsou absence podpory transakcí a cizích klíčů.

InnoDB

InnoDB je úložný stroj pro MySQL. MySQL 5.5 a později jej ve výchozím nastavení používá. Poskytuje standardní transakční funkce kompatibilní s ACID a podporu cizích klíčů (deklarativní referenční integrita). Implementuje transakce SQL a XA, tabulkové prostory, indexy FULLTEXT a prostorové operace podle standardu OpenGIS. Je standardně součástí většiny binárních souborů distribuovaných společností MySQL AB, výjimkou jsou některé verze OEM. Software je duálně licencován společností Oracle Corporation; je distribuován pod Všeobecnou veřejnou licencí GNU), ale může být také licencován stranám, které chtějí kombinovat InnoDB v proprietárním softwaru.

Vidličky

MariaDB má úložný stroj s názvem Aria, který je popisován jako „alternativa MyISAM bezpečná proti nárazu“. MariaDB a Percona Server standardně používají vidličku InnoDB nazvanou XtraDB. XtraDB je udržována společností Percona. Změny aplikace Oracle InnoDB jsou pravidelně importovány do XtraDB a jsou přidány některé opravy chyb a další funkce.

4
wogsland