MySQL:n osalta olisi vaikea ymmärtää MyISAMia ja InnoDB:tä, jotka ovat kaksi tunnetuinta ja laajimmin käytettyä MySQL-tallennusmoottoria. Tänään puhun teille MyISAMin ja InnoDB:n erosta MySQL:ssä...
Mikä on MyISAM?
MyISAM on oletustallennusmoottori MySQL-relaatiotietokantajärjestelmälle (ennen versiota 5.5)。 Tämä MySQL-taulun tallennusrakenne laajentaa monia hyödyllisiä ominaisuuksia vanhasta ISAM-koodista. Uudessa MySQL-versiossa InnoDB-moottori korvaa laajasti MyISAMin sen etujen vuoksi, kuten transaktioissa, referenttiaalisessa eheydessä ja suuremmassa rinnakkaisnopeudessa. Jokainen MyISAM-taulukko vastaa kolmea tiedostoa kovalevyllä. Kaikilla kolmella tiedostolla on sama tiedostonimi, mutta niillä on eri päätteet tyypin tarkoituksen osoittamiseksi: .frm-tiedosto sisältää taulukon määritelmän, mutta tämä tiedosto ei ole osa MyISAM-moottoria, vaan osa palvelinta; .MYD sisältää taulun tiedot; .MYI on taulukon indeksitiedosto.
Mikä on InnoDB?
InnoDB on toinen MySQL:n tallennusmoottori, ja MySQL AB:n julkaisema uusi versio sisältyy kaikkiin binääriasennuspaketteihin.5.5:stä eteenpäin oletustallennusmoottorina。 Sen etuja muihin tallennusmoottoreihin verrattuna ovat tuki ACID-yhteensopiville transaktioille (samankaltainen kuin PostgreSQL) ja parametrien eheys (eli tuki vieraille avaimille).
Oracle Corporation osti Innobasen lokakuussa 2005. Innobase käyttää kaksoistunnistautumisen valtuuksia. Se jaetaan GNU:n avulla ja mahdollistaa myös muille ryhmille, jotka haluavat sisällyttää InnoDB:n kaupalliseen ohjelmistoon, lisenssin saamisen.
Suosituimmat tallennusmoottorit ovat MyISAM ja InnoDB. Tärkeimmät erot MyISAMin ja InnoDB:n välillä ovat suorituskyky ja transaktioiden hallinta. MyISAM on laajennettu toteutus varhaisesta ISAMista (Indexed Sequential Access Method, ISAM ei ole enää tuettu MySQL 5.0:n jälkeen), ISAM on suunniteltu käsittelemään tilanteita, joissa lukutaajuus on paljon suurempi kuin kirjoitustaajuus, joten ISAM ja myöhemmät MyISAM eivät ota tukea pois, pois TPM:ää, eivät tarvitse transaktiotietueita, ISAMin kyselyjen tehokkuus on huomattava ja muistin kulutus on hyvin pieni. MyISAM perii nämä edut samalla kun pysyy ajan tasalla lukuisista hyödyllisistä uusista ominaisuuksista ja niihin liittyvistä työkaluista. Esimerkiksi samanaikaisuuden hallintaa tarkasteltaessa tarjotaan taulukkotason lukituksia, ja vaikka MyISAM ei itse tue vikansietokykyä, sitä voidaan käyttää vikojen palauttamiseen myisamchkin kautta. Koska MyISAM käyttää omia itsenäisiä tallennustiedostojaan (MYD-datatiedosto ja MYI-indeksitiedosto) jokaiselle taululle, sen varmuuskopiointi ja palautus on erittäin kätevää (kopioiminen ylikirjoitus riittää), ja se tukee myös verkkopalautusta. Verrattuna muihin tallennusmoottoreihin, MyISAMilla on eniten työkaluja taulukoiden tarkistamiseen ja korjaamiseen. MyISAM-taulukot voidaan pakata, ja ne tukevat kokotekstihakua. Ne eivät ole transaktioturvallisia, eivätkä tue vieraita avaimia, joten jos sovelluksesi ei vaadi tapahtumia ja hoitaa vain perus CRUD-toiminnot, MyISAM on oikea valinta. InnoDB on suunniteltu korkean samanaikaisuuden luku- ja kirjoitustilanteisiin, käyttäen MVCC:tä (Multi-Version Concurrency Control) ja rivitason lukkoja ACID-yhteensopivan transaktiotuen tarjoamiseksi. InnoDB tukee vieraiden avainten viite-eheyttä ja sillä on vikojen korjausmahdollisuudet. Lisäksi InnoDB:n suorituskyky on virallisesti varsin hyvä, erityisesti suurten tietomäärien käsittelyssä: InnoDB:n suorittimen tehokkuus on vertaansa vailla muihin levypohjaisiin relaatiotietokanta-tallennusmoottoreihin. Kuitenkin InnoDB:n varmuuskopiointi ja palautus ovat hieman hankalampia, ellei käytä Mulit-tablespace-tukea, jota tarjoaa versio 4.1 tai uudempi, koska toisin kuin MyISAM, InnoDB:n tietotiedostot eivät vastaa kutakin taulua erikseen. Sen sijaan käytetään jaettua taulukkotilaa, ja yksinkertainen kopiokirjoitusmenetelmä ei sovi hänelle, ja data on palautettava MYSQL:n lopettamisen jälkeen. Per table tablespacesd tarkoittaa, että jokainen taulukko vastaa erillistä taulukkoavaruustiedostoa, tilanne on paljon yksinkertaisempi. Sillä on samat ominaisuudet kuin BDB-tyypeillä, ja ne tukevat myös vieraita avaimia. InnoDB-taulukot ovat nopeita ja niissä on rikkaampia ominaisuuksia kuin BDB:ssä, joten niitä suositellaan, jos tarvitset transaktioisesti turvallisen tallennusmoottorin.
Yleisesti ottaen InnoDB on hyvä valinta, jos transaktiotukea tarvitaan, ja sillä on korkea samanaikainen luku- ja kirjoitustaajuus. BDB:tä voidaan harkita, jos samanaikaisten lukujen ja kirjoitusten määrä ei ole korkea, mutta BDB:tä ei enää tueta MySQL 5.1:ssä ja uudemmissa versioissa. Tämä vaihtoehto on poissa
Oletuksena InnoDB-transaktiot ovat avoimia (aseta automaattinen sitoutuminen = 0), mikä tarkoittaa, että aina kun tietue lisätään, InnoDB-taulu käsittelee sitä erillisenä transaktiona. Jos lisäämme 10 000 tietuetta emmekä sulje transaktiota, InnoDB-tyyppitaulu käsittelee sitä 10 000 transaktiona, ja kokonaissyöttöaika tällä hetkellä on suuri, jolloin transaktio täytyy ensin poistaa käytöstä ja sitten lisätä se, jolloin nopeus on hyvin nopea. Heapin ja BDB:n (Berkeley DB) kohdalla, suhteellisesti ottaen penetraationopeus ei ole yhtä hyvä kuin kahdessa edellisessä, mutta joissain tapauksissa, Heap-tallennusmoottori on edelleen hyvin sovellettavissa, se tallentaa dataa muistiin, ja se on erittäin nopea, koska levyn I/O:ta ei odota. Mutta koska kyseessä on muistin tallennusmoottori, kaikki tehdyt muutokset katoavat palvelimen uudelleenkäynnistyksen jälkeen. Heap on loistava paikka käyttää BDB:tä testaukseen, sillä se on MySQL:n ensimmäinen transaktioisesti turvallinen tallennusmoottori. Berkeley DB -tietokantakirjaston pohjalta rakennettu se on myös transaktioisesti turvallinen, mutta BDB ei ole selvästi yhtä suosittu kuin InnoDB, koska suurin osa MySQL:n tallennusmoottoreista, jotka tukevat transaktioita, etsivät myös MVCC- tai rivitason lukitustallennusmoottoreita, kun taas BDB tukee vain sivutason lukitusta.
InnoDB-moottori
InnoDB on transaktiotallennusmoottori, joka tukee palautuksia ja on suunniteltu tarjoamaan korkean suorituskyvyn palveluita suurten tietomäärien käsittelyssä, ja se luo muistiin puskuripoolit ajonaikaisesti datan ja indeksien puskurointia varten.
InnoDB-moottorin edut:
1. Tue transaktioiden käsittelyä ja ACID-transaktioita;
2. SQL-standardin neljä eristystasoa toteutetaan;
3. Tue rivitason lukitus- ja vierasavainrajoituksia;
4. Voit käyttää tapahtumalokkeja tietojen palautukseen.
5. Lukitustaso on rivilukitus, joka soveltuu usein taulukkojen muokkaamiseen korkealla samanaikaisuudella, ja korkea samanaikaisuus on parempi kuin MyISAM. Haittapuolena on, että järjestelmän kulutus on suuri.
6. Indeksi ei ainoastaan välimuistita itseään vaan myös dataa, mikä vaatii enemmän muistia kuin MyISAM.
InnoDB-moottorin haitat:
Koska taulukko ei tallenna rivien määrää, koko taulukko skannataan COUNT-tilastoja käytettäessä.
MyISAM-moottori
MyISAM oli oletusmoottori ennen MySQL 5.5.5:ttä ja se on suunniteltu lukemaan nopeasti.
MyISAM Enginen edut:
1. Korkean suorituskyvyn lukeminen;
2. Koska se tallentaa taulukon rivien määrän, koko taulukkoa ei skannata COUNT-tilastoja käytettäessä;
MyISAM-moottorin haitat:
1. Lukon taso on pöytälukko, ja kellolukon etuna on, että yläpuoli on pieni ja lukko nopea; Haittoina ovat lukon rakeisuus suuri, lukitusimpulssin todennäköisyys korkea ja samanaikaisuuden kapasiteetti pieni, mikä sopii kyselypohjaisille palveluille.
2. Tämä moottori ei tue tapahtumia tai vierasavaimia.
3. INSERT- ja UPDATE-operaatioiden tulee lukita koko taulukko;
4. Se tallentaa taulukon rivien määrän, joten kun VALITSE COUNT(*) TAULUKOSTA, sen tarvitsee lukea tallennetut arvot suoraan ilman koko taulukon skannausta.
Sovellettavat skenaariot
MyISAM soveltuu seuraaviin tarkoituksiin: (1) tekemään paljon laskentalaskentaa; (2) Harvinainen asettaminen ja hyvin usein kyselyt; (3) Ei ole liiketoimintaa.
InnoDB soveltuu seuraaviin tarkoituksiin: (1) korkeisiin luotettavuusvaatimuksiin tai transaktioihin; (2) Taulujen päivitykset ja kyselyt ovat melko yleisiä, ja taulun lukituksen riski on suhteellisen suuri.
Taulukkovertailu
| Ominaisuudet | MyISAM | Heap | BDB | InnoDB | | Kaupat | Ei tuettu | Ei tuettu | Olla jonkun kannattaja | Olla jonkun kannattaja | | Lukon rakeisuus | Pöytälukko | Pöytälukko | Sivulukitus (sivu, 8KB) | Lukko | | varastointi | Jaetut tiedostot | Muistoksi | Yksi tiedosto per taulukko | Taulukkotila | | Eristystaso | ei | ei | Lue sitoutunut | Kaikki | | Kannettava formaatti | olla | Ei lainkaan | ei | olla | | Viittauksen täydellisyys | ei | ei | ei | olla | | Datan primääriavain | ei | ei | olla | olla | | MySQL välimuistittaa tietotietueita | ei | Kyllä | Kyllä | Kyllä | | käytettävyys | Täysi versio | Täysi versio | MySQL-Max | Täysi versio |
Joitakin eroja yksityiskohdissa
1. InnoDB ei tue FULLTEXT-tyyppisiä indeksejä, joita on tuettu MySQL 5.6:sta (kokeellinen) lähtien.
2. InnoDB ei tallenna taulukon tarkkaa rivien määrää, eli kun select count() suoritetaan taulukosta, InnoDB:n täytyy skannata koko taulukko laskeakseen, kuinka monta riviä on, mutta MyISAM tarvitsee vain lukea tallennettujen rivien määrän. Huomaa, että kun count()-lauseessa on missä ehto, operaatio on sama molemmille tauluille.
3. AUTO_INCREMENT-tyyppisille kentille InnoDB:n täytyy sisältää indeksi, jossa on vain kyseinen kenttä, mutta MyISAM-taulukossa voit luoda yhteisen indeksin muiden kenttien kanssa.
4. Kun DELETE FROM taulu, InnoDB ei luo taulua uudelleen, vaan poistaa sen rivi riviltä.
5. LOAD TABLE FROM MASTER-toiminto ei toimi InnoDB:ssä, ratkaisu on ensin vaihtaa InnoDB-taulu MyISAM-tauluksi, tuoda data ja sitten vaihtaa se InnoDB-tauluun, mutta se ei sovellu tauluun, joka käyttää lisäominaisuuksia InnoDB:n (kuten vieraiden avaimien) kanssa.
6. Lisäksi InnoDB-taulukon rivilukitus ei ole absoluuttinen, jos MySQL ei pysty määrittämään skannattavaa aluetta SQL-lausetta suorittaessa, InnoDB-taulukko lukitsee myös koko taulun.
7. InnoDB ei tue täystekstin indeksointia, kun taas MyISAM tukee. Kokotekstin indeksointi tarkoittaa käänteisen järjestyksen indeksoinnin luomista jokaiselle sanalle charissa, varcharissa ja tekstissä (paitsi stop-sanat). MyISAMin kokotekstihakemisto on itse asiassa hyödytön, koska se ei tue kiinalaista sanasegmentointia, ja käyttäjän on kirjoitettava datataulukkoon sanasegmentoinnin jälkeen, ja alle 4 kiinalaista merkkiä sisältävät sanat jätetään huomiotta, kuten stop-sanat.
|