Kar zadeva MySQL, bi bilo težko razumeti MyISAM in InnoDB, ki sta dva najbolj znana in razširjena pogona za shranjevanje MySQL. Danes vam bom govoril o razliki med MyISAM in InnoDB v MySQL...
Kaj je MyISAM?
MyISAM je privzeti pogon za shranjevanje podatkov MySQL za upravljanje relacijskih podatkovnih baz (pred različico 5.5)。 Ta struktura shranjevanja MySQL tabel razširja številne uporabne funkcije iz stare ISAM kode. V novi različici MySQL pogon InnoDB v veliki meri nadomešča MyISAM zaradi svojih prednosti na področju transakcij, referenčne integritete in večje sočasnosti. Vsaka MyISAM tabela ustreza trem datotekam na trdem disku. Vse tri datoteke imajo enako ime datoteke, vendar različne končnice, ki označujejo njihov tipni namen: datoteka .frm vsebuje definicijo tabele, vendar ta datoteka ni del pogona MyISAM, temveč del strežnika; .MYD hrani podatke tabele; .MYI je indeksna datoteka tabele.
Kaj je InnoDB?
InnoDB je še en pogon za shranjevanje za MySQL, nova različica standarda, ki jo je izdal MySQL AB, pa je vključena v vse binarne namestitvene pakete.od 5.5 naprej kot privzeti pogon za shranjevanje。 Njegove prednosti pred drugimi pogoni za shranjevanje so podpora transakcijam, združljivim z ACID-om (podobno kot PostgreSQL) in integriteta parametrov (tj. podpora za tuje ključe).
Oracle Corporation je oktobra 2005 prevzel Innobase. Innobase uporablja dvojno avtentikacijo. Distribuira se z uporabo GNU in omogoča tudi drugim skupinam, ki želijo vključiti InnoDB v komercialno programsko opremo, da pridobijo licenco.
Najbolj priljubljena pogona za shranjevanje so MyISAM in InnoDB. Glavne razlike med MyISAM in InnoDB so zmogljivost in nadzor transakcij. MyISAM je razširjena implementacija zgodnjega ISAM-a (Indexed Sequential Access Method, ISAM po MySQL 5.0 ni več podprt), ISAM je zasnovan za obvladovanje situacij, kjer je frekvenca branja bistveno večja od frekvence pisanja, zato ISAM in kasnejši MyISAM ne upoštevata podpore za določene stvari, izključujeta TPM, ne potrebujeta zapisov transakcij, učinkovitost ISAM poizvedb je precejšnja, poraba pomnilnika pa zelo majhna. MyISAM podeduje te prednosti, hkrati pa sledi času z velikim številom uporabnih novih funkcij in sorodnih orodij. Na primer, če upoštevamo nadzor sočasnosti, so na voljo zaklepi na ravni tabele, in čeprav MyISAM sam ne podpira odpornosti na napake, ga je mogoče uporabiti za okrevanje po okvarah preko myisamchk. Ker MyISAM uporablja svoje neodvisne shranjevalne datoteke (MYD podatkovna datoteka in MYI indeksna datoteka) za vsako tabelo, je zelo priročno varnostno kopirati in obnoviti (kopiranje je dovolj), prav tako pa podpira spletno obnovo. V primerjavi z drugimi pogoni za shranjevanje ima MyISAM največ orodij za preverjanje in popravilo tabel. MyISAM tabele je mogoče stisniti in podpirajo iskanje v polnem besedilu. Niso varni za transakcije in ne podpirajo tujih ključev, zato če vaša aplikacija ne zahteva transakcij in obravnava le osnovne CRUD operacije, je MyISAM prava izbira. InnoDB je zasnovan za situacije branja in pisanja z visoko konkurenčnostjo, pri čemer uporablja MVCC (Multi-Version Concurrency Control) in zapornice na ravni vrstic za zagotavljanje podpore transakcijam, skladnih z ACID. InnoDB podpira integriteto referenc tujih ključev in ima možnosti obnove napak. Poleg tega je zmogljivost InnoDB dejansko precej dobra, še posebej pri obdelavi velikih količin podatkov, uradno gledano: CPU učinkovitost InnoDB je neprimerljiva z drugimi diskovnimi relacijskimi podatkovnimi shrambnimi pogoni. Vendar pa je varnostno kopiranje in obnova v InnoDB nekoliko bolj zapletena, razen če uporabljate podporo za multi-tabelni prostor, ki jo omogoča različica 4.1 ali novejša, saj za razliko od MyISAM podatkovne datoteke InnoDB ne ustrezajo vsaki tabeli posebej. Namesto tega se uporablja skupni mizni prostor, preprosta metoda prepisovanja pa zanj ni primerna, zato je treba podatke obnoviti po zaustavitvi MYSQL. Uporaba tablespacesd po tabelah naredi vsako tabelo enako ločeni tablespace datoteki, situacija je veliko enostavnejša. Ima enake značilnosti kot tipi BDB in prav tako podpirajo tuje ključe. InnoDB tabele so hitre in imajo bogatejše funkcije kot BDB, zato je priporočljivo, če potrebujete transakcijsko varen pogon za shranjevanje.
Na splošno je InnoDB dobra izbira, če je potrebna podpora transakcijam, in ima visoko frekvenco sočasnega branja in pisanja. BDB je mogoče upoštevati, če frekvenca sočasnih branj in zapisov ni visoka, vendar BDB ne bo več podprt v MySQL 5.1 in novejših različicah. Ta možnost je izginila
Privzeto so transakcije v InnoDB odprte (nastavi samodejno potrditev = 0), kar pomeni, da bo vsakič, ko se vstavi zapis, tabela InnoDB obravnavala to kot ločeno transakcijo. Torej, če vstavimo 10.000 zapisov in transakcije ne zapremo, bo tabela tipa InnoDB obravnavala transakcijo kot 10.000 transakcij, skupni čas vstavljanja pa je v tem trenutku velik; takrat moramo najprej izklopiti transakcijo in jo nato vstaviti, zato bo hitrost zelo hitra. Kar zadeva Heap in BDB (Berkeley DB), relativno gledano, stopnja penetracije ni tako dobra kot pri prejšnjih dveh, vendar v nekaterih primerih, Pogon za shranjevanje kopic je še vedno zelo uporaben, saj shranjuje podatke v pomnilnik, in je izjemno hiter, ker ni čakanja diskovnega I/O. Ker pa gre za pogon za shranjevanje pomnilnika, bodo vse spremembe izginile po ponovnem zagonu strežnika. Heap je odličen kraj za uporabo BDB za testiranje, saj je to prvi transakcijsko varen pogon za shranjevanje v MySQL. Zgrajen na osnovi knjižnice baze podatkov Berkeley DB, je tudi transakcijsko varen, vendar BDB očitno ni tako priljubljen kot InnoDB, saj večina pogonov za shranjevanje v MySQL, ki podpirajo transakcije, išče tudi MVCC ali mehanizme za shranjevanje na ravni vrstic, medtem ko BDB podpira le zaklepanje na ravni strani.
InnoDB pogon
InnoDB je transakcijski pogon za shranjevanje, ki podpira vračanje nazaj in je zasnovan za zagotavljanje visokozmogljivih storitev pri obdelavi velikih količin podatkov ter med izvajanjem vzpostavlja medpomnilniške sklade v pomnilniku za shranjevanje podatkov in indeksov.
Prednosti pogona InnoDB:
1. Podpora procesiranju transakcij in funkcijam transakcij ACID;
2. Realizirane so štiri ravni izolacije standarda SQL;
3. Podpora omejitvam na ravni vrstic in tujih ključev;
4. Za obnovo podatkov lahko uporabite transakcijske dnevnike.
5. Raven zaklepanja je vrstična zaklep, ki je primerna za pogoste spremembe tabele z visoko sočasnostjo, in visoka sočasnost je boljša kot MyISAM. Slabost pa je, da je poraba sistema velika.
6. Indeks ne predpomni le sebe, ampak tudi podatke, ki zahtevajo več pomnilnika kot MyISAM.
Slabosti pogona InnoDB:
Ker ne shranjuje števila vrstic v tabeli, se celotna tabela skenira z uporabo statistike COUNT.
MyISAM pogon
MyISAM je privzeti pogon pred MySQL 5.5.5 in je zasnovan za hitro branje.
Prednosti pogona MyISAM:
1. Visoko zmogljivo branje;
2. Ker shrani število vrstic v tabeli, celotna tabela ne bo skenirana pri uporabi statistike COUNT;
Slabosti pogona MyISAM:
1. Raven zapornice je mizna ključavnica, prednost urne ključavnice pa je, da je nadstropje majhno in da je ključavnica hitra; Slabosti so, da je zaklepna granularnost velika, verjetnost zaklepnega impulza visoka in nizka sočasnostna zmogljivost, kar je primerno za storitve, ki temeljijo na poizvedbah.
2. Ta pogon ne podpira transakcij ali tujih ključev.
3. Operaciji INSERT in UPDATE morata zakleniti celotno tabelo;
4. Shrani število vrstic v tabeli, tako da ko IZBERE COUNT(*) FROM TABLE, mora neposredno prebrati shranjene vrednosti brez pregledovanja celotne tabele.
Uporabni scenariji
MyISAM je primeren za: (1) izvajanje številnih izračunov štetja; (2) Redka vstavitev in zelo pogosta povpraševanja; (3) Ni posla.
InnoDB je primeren za: (1) zahteve po visoki zanesljivosti ali transakcije; (2) Posodobitve tabel in poizvedbe so precej pogoste, možnost zaklepanja tabele pa je razmeroma visoka.
Primerjava tabel
| Lastnosti | MyISAM | Kup | BDB | InnoDB | | Transakcije | Ni podprto | Ni podprto | V akvariju | V akvariju | | Granularnost zaklepa | Ključavnica mize | Ključavnica mize | Zaklep strani (stran, 8KB) | Zapornica | | skladiščenje | Razdeljene datoteke | V spominu | Ena mapa na mizo | Namizni prostor | | Raven izolacije | ne | ne | Preberi zavezano | Vsi | | Prenosni format | biti | N/A | ne | biti | | Popolnost citata | ne | ne | ne | biti | | Primarni ključ podatkov | ne | ne | biti | biti | | MySQL predpomni podatkovne zapise | ne | Da | Da | Da | | Uporabnost | Polna različica | Polna različica | MySQL-Max | Polna različica |
Nekatere razlike v podrobnostih
1. InnoDB ne podpira indeksov tipa FULLTEXT, kar je podprto že od MySQL 5.6 (eksperimentalno).
2. InnoDB ne shrani točnega števila vrstic tabele, torej mora pri izvajanju select count() iz tabele pregledati celotno tabelo, da izračuna, koliko vrstic je, medtem ko MyISAM preprosto prebere število shranjenih vrstic. Upoštevajte, da je operacija, kadar stavek count() vsebuje pogoj kjer, enaka za obe tabeli.
3. Za polja AUTO_INCREMENT vrste mora InnoDB vsebovati indeks samo s tem poljem, vendar lahko v tabeli MyISAM ustvarite skupni indeks z drugimi polji.
4. Ko IZBRIŠEM IZ tabele, InnoDB tabele ne bo ponovno ustvaril, temveč jo bo izbrisal vrstico za vrstico.
5. Operacija LOAD TABLE FROM MASTER ne deluje za InnoDB, rešitev je najprej spremeniti tabelo InnoDB v tabelo MyISAM, uvoziti podatke in nato spremeniti v tabelo InnoDB, vendar ni uporabna za tabelo, ki uporablja dodatne funkcije InnoDB (kot so tuji ključi).
6. Poleg tega zaklepanje vrstic v tabeli InnoDB ni absolutno; če MySQL ne more določiti obsega, ki ga je treba pregledati pri izvajanju SQL stavka, bo tabela InnoDB prav tako zaklenila celotno tabelo.
7. InnoDB ne podpira indeksiranja polnega besedila, medtem ko MyISAM to omogoča. Indeksiranje v celotnem besedilu pomeni ustvarjanje indeksa v obratnem vrstnem redu vsake besede v črnih črkah, varčarju in besedilu (razen za zaporne besede). MyISAM-ov indeks polnega besedila je pravzaprav neuporaben, saj ne podpira segmentacije kitajskih besed in ga mora uporabnik po segmentaciji besed zapisati v podatkovno tabelo, besede z manj kot 4 kitajskimi znaki pa bodo prezrte kot stop besede.
|