Kalbant apie MySQL, būtų sunku suprasti MyISAM ir InnoDB, kurie yra du žinomiausi ir plačiausiai naudojami MySQL saugojimo varikliai. Šiandien pakalbėsiu su jumis apie skirtumą tarp MyISAM ir InnoDB MySQL...
Kas yra MyISAM?
MyISAM yra numatytasis MySQL reliacinės duomenų bazės valdymo sistemos saugojimo variklis (iki 5.5)。 Ši MySQL lentelės saugojimo struktūra išplečia daug naudingų funkcijų iš senojo ISAM kodo. Naujoje "MySQL" versijoje "InnoDB" variklis plačiai pakeičia "MyISAM" dėl savo pranašumų, susijusių su sandoriais, nuorodų vientisumu ir didesniu sutapimu. Kiekviena "MyISAM" lentelė atitinka tris failus standžiajame diske. Visi trys failai turi tą patį failo pavadinimą, tačiau turi skirtingus plėtinius, nurodančius jų tipo paskirtį: .frm faile yra lentelės apibrėžimas, tačiau šis failas yra ne MyISAM variklio, o serverio dalis; .MYD yra lentelės duomenys; .MYI yra lentelės indekso failas.
Kas yra InnoDB?
"InnoDB" yra dar vienas "MySQL" saugojimo variklis, o nauja "MySQL AB" išleista standarto versija yra įtraukta į visus dvejetainius diegimo paketus.Nuo 5.5 iki numatytojo saugojimo modulio。 Jo pranašumai, palyginti su kitais saugojimo varikliais, yra su ACID suderinamų operacijų palaikymas (panašus į PostgreSQL) ir parametrų vientisumas (ty išorinių raktų palaikymas).
"Oracle Corporation" įsigijo "Innobase" 2005 m. spalį. "Innobase" naudoja dvigubo autentifikavimo autorizaciją. Jis platinamas naudojant GNU ir taip pat leidžia kitoms grupėms, norinčioms įtraukti InnoDB į komercinę programinę įrangą, gauti licenciją.
Populiariausi saugojimo varikliai yra MyISAM ir InnoDB. Pagrindiniai "MyISAM" ir "InnoDB" skirtumai yra našumas ir operacijų kontrolė. MyISAM yra išplėstinis ankstyvojo ISAM (indeksuotos nuoseklios prieigos metodas, ISAM nebepalaikomas po MySQL 5.0) įgyvendinimas, ISAM skirtas tvarkyti situacijas, kai skaitymo dažnis yra daug didesnis nei rašymo dažnis, todėl ISAM ir vėliau MyISAM neatsižvelgia į daiktų palaikymą, neįtraukia TPM, nereikia operacijų įrašų, ISAM užklausos efektyvumas yra didelis, o atminties suvartojimas yra labai mažas. MyISAM paveldi šiuos privalumus, neatsiliekant nuo daugybės naudingų naujų funkcijų ir susijusių įrankių. Pavyzdžiui, atsižvelgiant į sutapimo valdymą, pateikiami lentelės lygio užraktai, ir nors pats MyISAM nepalaiko gedimų tolerancijos, jis gali būti naudojamas atsigauti po gedimų naudojant myisamchk. Kadangi "MyISAM" kiekvienai lentelei naudoja savo nepriklausomus saugojimo failus (MYD duomenų failą ir MYI indekso failą), labai patogu kurti atsargines kopijas ir atkurti (pakanka kopijos perrašymo), taip pat palaiko atkūrimą internete. Palyginti su kitais saugojimo varikliais, MyISAM turi daugumą lentelių tikrinimo ir taisymo įrankių. MyISAM lenteles galima suspausti ir jos palaiko viso teksto paiešką. Jie nėra saugūs sandoriams ir nepalaiko išorinių raktų, todėl jei jūsų programa nereikalauja operacijų ir atlieka tik pagrindines CRUD operacijas, MyISAM yra tinkamas būdas. InnoDB sukurtas didelio lygiagrečio skaitymo ir rašymo situacijoms, naudojant MVCC (Multi-Version Concurrency Control) ir eilutės lygio užraktus, kad būtų užtikrintas ACID suderinamas operacijų palaikymas. InnoDB palaiko išorinio rakto nuorodos vientisumą ir turi gedimų atkūrimo galimybes. Be to, InnoDB našumas iš tikrųjų yra gana geras, ypač apdorojant didelius duomenų kiekius, oficialiai kalbant: InnoDB procesoriaus efektyvumas yra nepalyginamas su kitais diskais pagrįstais reliacinių duomenų bazių saugojimo varikliais. Tačiau "InnoDB" atsarginė kopija ir atkūrimas yra šiek tiek varginantis, nebent naudojate "Mulit-tablespace" palaikymą, kurį teikia 4.1 ar naujesnė versija, nes, skirtingai nei "MyISAM", "InnoDB" duomenų failai neatitinka kiekvienos lentelės atskirai. Vietoj to naudojama bendra lentelės erdvė, o paprastas kopijavimo perrašymo būdas jam netinka, o sustabdžius MYSQL duomenys turi būti atkurti. Naudojant tablespacesd kiekviena lentelė atitinka atskirą tablespace failą, situacija yra daug paprastesnė. Jis turi tas pačias savybes kaip ir BDB tipai, be to, jie palaiko išorinius raktus. InnoDB lentelės yra greitos ir turi turtingesnes funkcijas nei BDB, todėl rekomenduojama, jei jums reikia transakcijų saugaus saugojimo variklio.
Apskritai "InnoDB" yra geras pasirinkimas, jei reikalingas operacijų palaikymas ir didelis skaitymo ir rašymo dažnis vienu metu. BDB galima apsvarstyti, jei vienu metu skaitomų ir rašomų dažnis nėra didelis, tačiau BDB nebebus palaikomas MySQL 5.1 ir naujesnėse versijose. Šios parinkties nebėra
Pagal numatytuosius nustatymus "InnoDB" operacijos yra atidarytos (nustatykite automatinį įsipareigojimą = 0), o tai reiškia, kad kiekvieną kartą įterpus įrašą, "InnoDB" lentelė jį traktuos kaip atskirą operaciją. Taigi, jei įterpsime 10 000 įrašų ir neuždarysime operacijos, tada "InnoDB" tipo lentelė ją traktuos kaip 10 000 operacijų, o bendras įterpimo laikas šiuo metu yra daug, šiuo metu pirmiausia turime išjungti operaciją ir tada ją įterpti, todėl greitis bus labai greitas Kalbant apie "Heap" ir BDB (Berkeley DB), santykinai kalbant, įsiskverbimo greitis nėra toks geras kaip ankstesnių dviejų, tačiau kai kuriais atvejais Vis dar labai tinka "Heap" saugojimo variklis, kuris saugo duomenis atmintyje ir yra itin greitas, nes nelaukia disko įvesties / išvesties. Bet kadangi tai yra atminties saugojimo variklis, visi atlikti pakeitimai išnyks paleidus serverį iš naujo. Heap yra puiki vieta naudoti BDB testavimui, nes tai yra pirmasis MySQL saugus saugyklos variklis. Sukurtas remiantis Berklio DB duomenų bazės biblioteka, jis taip pat yra saugus operacijų atžvilgiu, tačiau BDB akivaizdžiai nėra toks populiarus kaip InnoDB, nes dauguma MySQL saugyklos variklių, palaikančių operacijas, taip pat ieško MVCC arba eilučių lygio užrakinimo saugyklos variklių, o BDB palaiko tik puslapio lygio užraktą.
InnoDB variklis
"InnoDB" yra operacijų saugojimo variklis, palaikantis atšaukimus ir skirtas teikti didelio našumo paslaugas apdorojant didelius duomenų kiekius, o vykdymo metu atmintyje sukuria buferinius telkinius, kad būtų galima buferizuoti duomenis ir indeksus.
InnoDB variklio privalumai:
1. Palaikykite operacijų apdorojimo ir ACID operacijų funkcijas;
2. Realizuojami keturi SQL standarto izoliacijos lygiai;
3. Palaikykite eilutės lygio užraktą ir išorinio rakto apribojimus;
4. Duomenų atkūrimui galite naudoti operacijų žurnalus.
5. Užrakto lygis yra eilutės užraktas, kuris tinka dažnam stalo modifikavimui su dideliu sutapimu, o didelis sutapimas yra geresnis nei MyISAM. Trūkumas yra tas, kad sistemos suvartojimas yra didelis.
6. Indeksas ne tik saugo save, bet ir duomenis, kuriems reikia daugiau atminties nei MyISAM.
"InnoDB" variklio trūkumai:
Kadangi lentelėje neišsaugomas eilučių skaičius, naudojant COUNT statistiką nuskaitoma visa lentelė.
MyISAM variklis
MyISAM yra numatytasis variklis prieš MySQL 5.5.5 ir skirtas greitai skaityti.
MyISAM variklio privalumai:
1. Didelio našumo skaitymas;
2. Kadangi išsaugomas lentelės eilučių skaičius, naudojant COUNT statistiką visa lentelė nebus nuskaityta;
MyISAM variklio trūkumai:
1. Užrakto lygis yra stalo užraktas, o laikrodžio užrakto privalumas yra tas, kad viršutinė dalis yra maža, o užraktas greitas; Trūkumai yra tai, kad užrakto detalumas yra didelis, užrakto impulso tikimybė yra didelė, o sutapimo pajėgumas yra mažas, o tai tinka užklausomis pagrįstoms paslaugoms.
2. Šis modulis nepalaiko operacijų ar išorinių raktų.
3. INSERT ir UPDATE operacijos turi užrakinti visą lentelę;
4. Jame saugomas lentelės eilučių skaičius, todėl kai SELECT COUNT(*) FROM TABLE, reikia tik tiesiogiai nuskaityti išsaugotas reikšmes, nenuskaitant visos lentelės.
Taikomi scenarijai
MyISAM tinka: (1) atlikti daug skaičiavimo skaičiavimų; (2) Retas įterpimas ir labai dažnos užklausos; (3) Nėra verslo.
InnoDB tinka: (1) aukštiems patikimumo reikalavimams ar operacijoms; (2) Lentelės atnaujinimai ir užklausos yra gana dažni, o lentelės užrakinimo tikimybė yra gana didelė.
Lentelės palyginimas
| Savybės | MyISAM | Krūva | BDB | InnoDB | | Sandoriai | Nepalaikoma | Nepalaikoma | Kažkieno pusėje | Kažkieno pusėje | | Užrakto detalumas | Stalo užraktas | Stalo užraktas | Puslapio užraktas (puslapis, 8KB) | Užraktas | | sandėliavimas | Padalinti failus | Atmintyje | Vienas failas kiekvienoje lentelėje | Stalo erdvė | | Izoliacijos lygis | ne | ne | Skaityti įsipareigojo | Visi | | Nešiojamasis formatas | būti | N/A | ne | būti | | Citatos išsamumas | ne | ne | ne | būti | | Pirminis duomenų raktas | ne | ne | būti | būti | | MySQL talpykloje saugo duomenų įrašus | ne | Taip | Taip | Taip | | Naudojimo | Pilna versija | Pilna versija | MySQL-Max | Pilna versija |
Kai kurie detalių skirtumai
1. InnoDB nepalaiko FULLTEXT tipo indeksų, kurie buvo palaikomi nuo MySQL 5.6 (eksperimentinis).
2. "InnoDB" neišsaugo konkretaus lentelės eilučių skaičiaus, tai yra, vykdant select count() iš lentelės, "InnoDB" turi nuskaityti visą lentelę, kad apskaičiuotų, kiek yra eilučių, tačiau "MyISAM" tereikia tiesiog perskaityti išsaugotų eilučių skaičių. Atkreipkite dėmesį, kad kai sakinyje count() yra sąlyga where, operacija yra tokia pati abiejose lentelėse.
3. AUTO_INCREMENT tipo laukuose InnoDB turi būti indeksas, kuriame yra tik tas laukas, tačiau MyISAM lentelėje galite sukurti bendrą indeksą su kitais laukais.
4. Kai DELETE FROM lentelė, InnoDB iš naujo nesukurs lentelės, bet ištrins ją eilutė po eilutės.
5. Operacija LOAD TABLE FROM MASTER neveikia InnoDB, sprendimas yra pirmiausia pakeisti InnoDB lentelę į MyISAM lentelę, importuoti duomenis ir tada pakeisti juos į InnoDB lentelę, tačiau ji netaikoma lentelei, kurioje naudojamos papildomos InnoDB funkcijos (pvz., Išoriniai raktai).
6. Be to, InnoDB lentelės eilutės užraktas nėra absoliutus, jei MySQL negali nustatyti nuskaitomo diapazono vykdant SQL sakinį, InnoDB lentelė taip pat užrakins visą lentelę.
7. "InnoDB" nepalaiko viso teksto indeksavimo, o "MyISAM" tai daro. Viso teksto indeksavimas reiškia kiekvieno žodžio atvirkštinės tvarkos indekso sukūrimą char, varchar ir tekste (išskyrus stabdymo žodžius). MyISAM viso teksto indeksas iš tikrųjų yra nenaudingas, nes jis nepalaiko kinų kalbos žodžių segmentavimo, todėl vartotojas turi jį įrašyti į duomenų lentelę po žodžių segmentavimo, o žodžiai, turintys mažiau nei 4 kiniškus simbolius, bus ignoruojami kaip stabdymo žodžiai.
|