chevron-left chevron-right

[MySQL] Jakie są różnice między MyISAM a InnoDB?

Jakiś czas temu, podczas projektowania aplikacji internetowej, zacząłem się zastanawiać - jakie są różnice pomiędzy MyISAM a InnoDB? Który mechanizm składowania danych wybrać, aby było wszystko ok? Tak powstał pomysł na ten artykuł. Postaram się w nim przybliżyć specyfikę obydwu systemów i spróbuję Ci wskazać ten lepszy.

Różnice w możliwościach i działaniu

  1. InnoDB jest nowszym rozwiązaniem niż MyISAM
  2. InnoDB jest bardziej rozbudowany a MyISAM jest prostszy
  3. InnoDB bardziej dba o integralność danych niż MyISAM
  4. InnoDB stosuje blokadę poszczególnych wierszy na czas edycji i aktualizacji danych w bazie, podczas gdy MyISAM stosuje blokadę całej tabeli (w skrócie - na czas operacji w InnoDB tylko wiersze są niedostępne, a w MyISAM cała tabela)
  5. InnoDB posiada system transakcyjny, a MyISAM nie
  6. InnoDB pozwala na korzystanie z kluczy obcych, a MyISAM nie
  7. InnoDB lepiej radzi sobie z odzyskiwaniem danych po ewentualnych crashach
  8. MyISAM ma pełnotekstowy indeks wyszukiwania

Zalety InnoDB

  1. InnoDB powinno być wykorzystywane wszędzie tam, gdzie integralność danych jest priorytetem
  2. Jest lepszy tam gdzie występuje duży nacisk na zapisywanie danych do bazy danych ze względu na blokowanie tylko wierszy a nie całej tabeli.

Wady InnoDB

  1. Z powodu większej dbałości o relacje między tabelami, administrator bazy danych oraz twórca bazy danych muszą więcej czasu przeznaczyć na projektowanie struktury takiej bazy oraz przepływu danych w niej zawartych.
  2. Wykorzystuje więcej zasobów systemowych do działania, takich jak pamięć RAM.
  3. Brak indeksowania pełnotekstowego

Zalety MyISAM

  1. Bazy danych w tym systemie są prostsze do zaprojektowania i stworzenia, w szczególności dla początkujących.
  2. Ogólnie, jest szybsza ze względu na swoją prostotę i nie zużywa tak wielu zasobów systemów tak jak InnoDB
  3. Posiada indeksowanie pełnotekstowe
  4. Ze względu na powyższe indeksy jest szczególnie efektywna gdy istnieje potrzeba intensywnego odczytywania danych z bazy danych

Wady MyISAM

  1. Brak sprawdzania integralności danych, co zwiększa liczbę problemów dla administratorów baz danych
  2. Brak wsparcia dla transakcji, które są szczególnie ważne takich systemach bazodanowych jak systemy dla banków, systemy dla korporacji, itp., itd.
  3. Wolniejsza od InnoDB w przypadku częstego zapisu danych do bazy danych i ich aktualizacji w bazie

Podsumowanie

Mam nadzieję, że udało mi się przybliżyć Tobie wady i zalety każdego z tych mechanizmów MySQL. Jak widać, InnoDB jest przydatne w momencie gdy potrzebujemy aby nasze dane w bazie były jak najlepiej zabezpieczone przed błędami czy awariami, oraz w momencie gdy zależy nam na jak najszybszym zapisywaniu nowych danych do bazy. Natomiast, MyISAM jest lepszy przy prostszych projektach takich jak zwykłe strony internetowe, gdzie w zasadzie dane są zapisywane w bazie od czasu do czasu, ale za to o wiele częściej są odczytywane z niej.
Wracając do mojego problemu z początku tekstu, to ja postanowiłem wymieszać InnoDB z MyISAM. To znaczy część tabel potraktowałem mechanizmem MyISAM, a część (mniejszą) mechanizmem InnoDB i wszystko pięknie działa.

  • Comandeer

    „Z powodu większej dbałości o relacje między tabelami, administrator bazy danych oraz twórca bazy danych muszą więcej czasu przeznaczyć na projektowanie struktury takiej bazy oraz przepływu danych w niej zawartych.”
    To raczej zaleta 😀
    „postanowiłem wymieszać InnoDB z MyISAM”
    Pójdź jeszcze dalej: wymieszaj SQL z NOSQL – to dopiero jest zabawa 😉
    Osobiście korzystam zarówno z MySQL (InnoDB, bo przechowuję dane userów i uwielbiam korzystać z kluczy obcych), jak i MongoDB (bo część aplikacji korzysta z node.js, a tam lepiej użyć MongoDB niż bawić się z eksperymentalnymi sterownikami do MySQL) i nie narzekam.
    BTW weź zwiększ to pole komentowania, bo strasznie małe

  • Pójdź jeszcze dalej: wymieszaj SQL z NOSQL ? to dopiero jest zabawa

    Aż tak daleko chyba nie ma sensu iść 😉
    Co do node.js to muszę kiedyś spróbować się tym zabawić.
    Odnośnie tego czy zwiększona ilość pracy nad projektowaniem bazy danych jest zaletą czy wadą, to ja to uznałem za wadę, niewielką, ale jednak.

  • Co do mieszania SQL z NOSQL to wszystko zależy od skali projektu. Dla projektów które będą uruchamiane kilka razy dziennie nie zrobi to różnicy. Jednak gdy Twoja aplikacja będzie miała obsłużyć 100req/s to pewnie będziesz myślał jak odciążyć i skalować bazę. Wtedy właśnie wykorzystasz pełne zalety NOSQL…

  • Luke

    Fajny wpis. Można się dużo dowiedzieć 🙂

  • Witam,
    a ja mam takie pytanie, czy różnica w wydajności obu tych mechanizmów jest widoczna / odbija się na obciążeniu konta w wypadku hostingu współdzielonego?
    Zdaję sobie sprawę, że np. w wypadku konfiguracji VPSa z niewielką ilością pamięci RAM warto to konfiguracji bazy dorzucić skip-innodb (i baza bierze nagle ~50% pamięci mniej), ale nie mam pojęcia, jak to wygląda na shared hostingu, którzy szczerze mówiąc jednak preferuję.

  • Szczerze mówiąc, nie mam pojęcia.