Când vine vorba de MySQL, ar fi dificil să înțelegem MyISAM și InnoDB, care sunt două dintre cele mai cunoscute și utilizate motoare de stocare MySQL. Astăzi vă voi vorbi despre diferența dintre MyISAM și InnoDB în MySQL...
Ce este MyISAM?
MyISAM este motorul de stocare implicit pentru sistemul de gestionare a bazelor de date relaționale MySQL (înainte de versiunea 5.5)。 Această structură de stocare a tabelelor MySQL extinde multe funcționalități utile din vechiul cod ISAM. În noua versiune a MySQL, motorul InnoDB înlocuiește pe scară largă MyISAM datorită avantajelor sale în ceea ce privește tranzacțiile, integritatea referențială și concurența mai mare. Fiecare tabel MyISAM corespunde a trei fișiere de pe hard disk. Toate cele trei fișiere au același nume de fișier, dar extensii diferite pentru a indica scopul tipului: fișierul .frm conține definiția tabelului, dar acest fișier nu face parte din motorul MyISAM, ci din server; .MYD conține datele tabelului; .MYI este fișierul index al tabelului.
Ce este InnoDB?
InnoDB este un alt motor de stocare pentru MySQL, iar noua versiune a standardului lansat de MySQL AB este inclusă în toate pachetele de instalare binară.începând cu 5.5 ca motor de stocare implicit。 Avantajele sale față de alte motoare de stocare sunt suportul pentru tranzacții compatibile cu ACID (similar cu PostgreSQL) și integritatea parametrilor (adică suportul pentru chei străine).
Oracle Corporation a achiziționat Innobase în octombrie 2005. Innobase folosește autorizare duală de autentificare. Este distribuit folosind GNU și permite, de asemenea, altor grupuri care doresc să încorporeze InnoDB în software comercial să obțină o licență.
Cele mai populare motoare de stocare sunt MyISAM și InnoDB. Principalele diferențe dintre MyISAM și InnoDB sunt performanța și controlul tranzacțiilor. MyISAM este o implementare extinsă a timpuriului ISAM (Indexed Sequential Access Method, ISAM nu mai este suportat după MySQL 5.0), ISAM este proiectat să gestioneze situații în care frecvența de citire este mult mai mare decât frecvența de scriere, astfel că ISAM și ulterior MyISAM nu iau în considerare suportul pentru lucruri, exclud TPM, nu au nevoie de înregistrări de tranzacții, eficiența interogărilor ISAM este considerabilă, iar consumul de memorie este foarte mic. MyISAM moștenește aceste beneficii în timp ce ține pasul cu un număr mare de funcționalități noi utile și instrumente conexe. De exemplu, luând în considerare controlul concurenței, sunt oferite blocaje la nivel de tabel, iar deși MyISAM în sine nu suportă toleranță la erori, poate fi folosit pentru a recupera după defecțiuni prin myisamchk. Și deoarece MyISAM folosește propriile fișiere de stocare independente (fișier de date MYD și fișier index MYI) pentru fiecare tabel, este foarte convenabil să faci backup și restaurare (suprascrierea copierii este suficientă) și suportă, de asemenea, recuperarea online. Comparativ cu alte motoare de stocare, MyISAM are majoritatea uneltelor pentru verificarea și repararea tabelelor. Tabelele MyISAM pot fi comprimate și suportă căutare fulltext. Acestea nu sunt sigure pentru tranzacții și nu suportă chei străine, așa că dacă aplicația ta nu necesită tranzacții și gestionează doar operațiuni CRUD de bază, atunci MyISAM este calea de urmat. InnoDB este proiectat pentru situații de citire și scriere cu concurență ridicată, folosind MVCC (Multi-Version Concurrency Control) și blocaje la nivel de rând pentru a oferi suport pentru tranzacții conforme cu ACID. InnoDB suportă integritatea referințelor de chei străine și are capabilități de recuperare a erorilor. În plus, performanța InnoDB este de fapt destul de bună, mai ales când procesează cantități mari de date, în termeni oficiali: eficiența CPU-ului InnoDB este incomparabilă cu alte motoare de stocare relațională bazate pe disc. Totuși, backup-ul și recuperarea InnoDB sunt puțin mai problematice, cu excepția cazului în care folosești suportul Mulit-tablespace oferit de versiunea 4.1 sau ulterioară, deoarece, spre deosebire de MyISAM, fișierele de date ale InnoDB nu corespund fiecărui tabel independent. În schimb, se folosește spațiul partajat al tabelelor, iar metoda simplă de suprascriere a copiilor nu este potrivită pentru el, iar datele trebuie restaurate după oprirea MYSQL. Folosirea tablespaced per tabel face ca fiecare tabel să corespundă unui fișier separat de spațiu de tabel, situația fiind mult mai simplă. Are aceleași caracteristici ca tipurile BDB și suportă și chei străine. Tabelele InnoDB sunt rapide și au funcții mai bogate decât BDB, așa că este recomandat dacă ai nevoie de un motor de stocare cu securitate tranzacțională.
În general, InnoDB este o alegere bună dacă este nevoie de suport pentru tranzacții și are o frecvență mare de citire și scriere simultană. BDB poate fi luat în considerare dacă frecvența citirilor și scrierilor simultane nu este mare, dar BDB nu va mai fi suportat în MySQL 5.1 și versiunile ulterioare. Această opțiune a dispărut
În mod implicit, tranzacțiile InnoDB sunt deschise (setați autocommit = 0), ceea ce înseamnă că de fiecare dată când o înregistrare este inserată, tabelul InnoDB o va trata ca pe o tranzacție separată. Așadar, dacă introducem 10.000 de înregistrări și nu închidem tranzacția, atunci tabelul de tip InnoDB va trata ca fiind 10.000 de tranzacții, iar timpul total de inserare în acest moment este mult, în acest moment trebuie să oprim mai întâi tranzacția și apoi să o introducem, astfel încât viteza să fie foarte rapidă. În ceea ce privește Heap și BDB (Berkeley DB), relativ vorbind, rata de penetrare nu este la fel de bună ca la cele două anterioare, dar în unele cazuri, Motorul de stocare Heap este încă foarte aplicabil, stocând date în memorie și este extrem de rapid deoarece nu există I/O pe disc în așteptare. Dar, fiind un motor de stocare a memoriei, orice modificări vor dispărea după ce serverul se repornește. Heap este un loc excelent pentru a folosi BDB pentru testare, fiind primul motor de stocare MySQL cu securitate tranzacțională. Construit pe baza bibliotecii de baze de date Berkeley DB, este de asemenea sigur tranzacțional, dar BDB nu este evident la fel de popular ca InnoDB, deoarece majoritatea motoarelor de stocare din MySQL care suportă tranzacții caută și motoarele MVCC sau de blocare la nivel de rând, în timp ce BDB suportă doar blocarea la nivel de pagină.
Motorul InnoDB
InnoDB este un motor de stocare tranzacțională care suportă rollback-uri și este proiectat să ofere servicii de înaltă performanță la procesarea unor cantități mari de date și stabilește pool-uri de buffer în memorie la timpul execuției pentru a stoca date și indici.
Avantajele motorului InnoDB:
1. Susținerea procesării tranzacțiilor și caracteristicilor tranzacțiilor ACID;
2. Se realizează patru niveluri de izolare ale standardului SQL;
3. Suportă constrângeri de blocare la nivel de rând și cheie străină;
4. Poți folosi jurnalele tranzacțiilor pentru recuperarea datelor.
5. Nivelul de blocare este blocarea pe rând, care este potrivită pentru modificări frecvente ale tabelelor cu concurență mare, iar concurența mare este mai bună decât MyISAM. Dezavantajul este că consumul sistemului este mare.
6. Indexul nu doar că se stochează singur, ci și datele în cache, ceea ce necesită mai multă memorie decât MyISAM.
Dezavantajele motorului InnoDB:
Deoarece nu salvează numărul de rânduri din tabel, întregul tabel este scanat atunci când se folosesc statistici COUNT.
Motorul MyISAM
MyISAM este motorul implicit înainte de MySQL 5.5.5 și este proiectat să citească rapid.
Avantajele motorului MyISAM:
1. Citire de înaltă performanță;
2. Deoarece salvează numărul de rânduri din tabel, întregul tabel nu va fi scanat atunci când se folosesc statistici COUNT;
Dezavantaje ale motorului MyISAM:
1. Nivelul lacătului este un lacăt de masă, iar avantajul lacătului de ceas este că încuietoarea este mică și lacătul este rapid; Dezavantajele sunt că granularitatea blocajului este mare, probabilitatea impulsului blocajului este ridicată, iar capacitatea de concurență este scăzută, ceea ce este potrivit pentru servicii bazate pe interogări.
2. Acest motor nu suportă tranzacții sau chei străine.
3. Operațiunile INSERT și UPDATE trebuie să blocheze întreaga tabelă;
4. Stochează numărul de rânduri din tabel, astfel încât, atunci când SELECT COUNT(*) DIN TABEL, trebuie doar să citească direct valorile salvate fără a scana întregul tabel.
Scenarii aplicabile
MyISAM este potrivit pentru: (1) efectuarea multor calcule de numărare; (2) Inserții rare și interogări foarte frecvente; (3) Nu există afaceri.
InnoDB este potrivit pentru: (1) cerințe ridicate de fiabilitate sau tranzacții; (2) Actualizările și interogările tabelelor sunt destul de frecvente, iar șansa de blocare a tabelului este relativ mare.
Comparație de tabele
| Proprietăți | MyISAM | Heap | BDB | InnoDB | | Tranzacții | Nesuportat | Nesuportat | În rezervor | În rezervor | | Granularitatea blocajului | Încuietoare la masă | Încuietoare la masă | Blocarea paginii (pagină, 8KB) | Încuietoare | | depozitare | Fișiere împărțite | în memorie | Un fișier pe tabel | Spațiu de masă | | Nivelul de izolare | nu | nu | Citește Compromis | Toate | | Format portabil | fi | N/A | nu | fi | | Completitudinea citărilor | nu | nu | nu | fi | | Cheia primară de date | nu | nu | fi | fi | | MySQL stochează în cache înregistrările de date | nu | Da | Da | Da | | utilizabilitate | Versiunea completă | Versiunea completă | MySQL-Max | Versiunea completă |
Unele diferențe de detalii
1. InnoDB nu suportă indexuri de tip FULLTEXT, care sunt suportate încă din MySQL 5.6 (experimental).
2. InnoDB nu salvează numărul specific de rânduri ale tabelului, adică, atunci când execută select count() din tabel, InnoDB trebuie să scaneze întregul tabel pentru a calcula câte rânduri există, dar MyISAM trebuie doar să citească pur și simplu numărul de rânduri salvate. Rețineți că atunci când instrucțiunea count() conține o condiție where, operația este aceeași pentru ambele tabele.
3. Pentru câmpurile de AUTO_INCREMENT tip, InnoDB trebuie să conțină un index doar cu acel câmp, dar în tabelul MyISAM poți crea un index comun cu alte câmpuri.
4. Când ȘTERGE TABELUL, InnoDB nu va recrea tabelul, ci îl va șterge linie cu linie.
5. Operația LOAD TABLE FROM MASTER nu funcționează pentru InnoDB, soluția este să se schimbe mai întâi tabelul InnoDB în tabelul MyISAM, să se importe datele, apoi să se schimbe în tabelul InnoDB, dar nu este aplicabil tabelului care folosește funcții suplimentare InnoDB (cum ar fi cheile străine).
6. În plus, blocarea pe rând a tabelului InnoDB nu este absolută, dacă MySQL nu poate determina intervalul ce trebuie scanat la executarea unei instrucțiuni SQL, tabelul InnoDB va bloca și întregul tabel.
7. InnoDB nu suportă indexarea textului complet, în timp ce MyISAM o face. Indexarea textului integral se referă la crearea unui index de ordine inversă pentru fiecare cuvânt în caractere, varchar și text (cu excepția cuvintelor oprite). Indexul textului integral al MyISAM este de fapt inutil, deoarece nu suportă segmentarea cuvintelor chinezești și trebuie scris în tabelul de date de către utilizator după segmentarea cuvintelor, iar cuvintele cu mai puțin de 4 caractere chinezești vor fi ignorate ca și cuvintele stop.
|