InnoDB ir MyISAM – Kurį Turėtumėte Pasirinkti?

InnoDB ir MyISAM yra vieni populiariausių MySQL variklių. Kiekvienas iš jų turi savo privalumų ir trūkumų – pamėginsime juos peržvelgti.

Trumpai apie MyISAM

MyISAM buvo MySQL variklis, kuris buvo naudojamas iki MySQL 5.5 versijos, kuri buvo išleista 2009 m. gruodžio mėnesį. MyISAM yra pagrįsta senu ISAM saugojimo varikliu, kuris buvo naudojamas iki MySQL 3.23 – nuo šios MySQL versijos ISAM pakeitė MyISAM. MyISAM variklis buvo išleistas ankščiau nei InnoDB.

MyISAM Savybės

MyISAM variklio funkcijos yra šios:

  • MyISAM palaiko užrakinimą lentelės lygiu – tai yra viena iš pagrindinių priežasčių, kodėl girdėsite, kad MyISAM dažnai pasirenkamas kaip tinkamesnis saugojimo variklis skaitymo operacijoms. Šitoks užrakinimo būdas taip pat leidžia išvengti blokavimų, kai užklausa visada reikalauja visų užraktų, o lentelės visada užrakinamos ta pačia tvarka. Pagrindiniai lentelės lygio užrakinimo pranašumai yra tie, kad tokio lygio užrakinimas reikalauja palyginti mažai atminties palyginus su eilučių lygio užrakinimu ir toks užrakinimo būdas yra ganėtinai greitas, jei jums reikia dažnai nuskaityti visas lentelėje esančias reikšmes;
  • MyISAM palaiko full-text indeksus pagal nutylėjimą – InnoDB pradėjo palaikyti full-text indeksus tik nuo MySQL 5.6 versijos;
  • MyISAM turi keletą pranašumų indeksų atžvilgiu – naudodamiesi MyISAM galite sukurti indeksus pirmiesiems 500 simbolių BLOB ir TEXT stulpeliuose;
  • MyISAM duomenų saugojimo variklis sunaudoja mažiau disko vietos nei InnoDB – MyISAM sunaudoja du ar tris kartus mažiau vietos diske nei InnoDB. Tai yra galbūt vienintelis iš šio variklio pranašumų;
  • Paprastesnis dizainas – MyISAM dizainas yra paprastesnis palyginus su InnoDB.

Trumpai apie InnoDB

InnoDB yra bendrosios paskirties MySQL duomenų saugojimo variklis ir numatytasis duomenų saugojimo variklis nuo MySQL 5.6. Variklis palaiko su ACID suderinamas operacijų funkcijas, svetimus raktus (angl. “foreign keys”), balansuoja patikimumą ir aukštą našumą bei yra daugumos programuotojų dirbančių su MySQL numylėtinis.

InnoDB Savybės

InnoDB variklio funkcijos yra šios:

  • InnoDB palaiko įrašų lygio užraktus – skirtingai nei MyISAM, InnoDB palaiko užraktus eilutės (įrašų) lygiu, kas reiškia, kad bus užrakintas tik tas įrašas, kurio reikia programinei įrangai. Šis užrakinimo būdas leidžia ilgam laikui užrakinti vieną įrašą (padaryti jį neprieinamu kitiems) ir sukelia mažiau užrakto konfliktų kai yra prieinama prie daug įrašų per kelias sesijas;
  • Pagrindinis nauojamas mechanizmas yra InnoDB buferis (angl. “buffer pool”) – buferis kaupia duomenis ir indeksų puslapius iš InnoDB lentelių;
  • InnoDB palaiko svetimus raktus (angl. “foreign keys”) – svetimi raktai (indeksai) leidžia programuotojams leisti duomenų bazėms užtikrinti jos būsenos ir ryšių tarp lentelių vientisumą;
  • InnoDB palaiko ACID parametrus – InnoDB palaiko standartines ACID reikalavimus atitinkančias operacijas.

Kurį variklį pasirinkti?

Darbas su MyISAM nėra labai malonus todėl, nes šis variklis naudoja lentelės lygio užraktus ir neturi trikdžių atstatymo mechanizmo. Be to, InnoDB turi beveik visas funkcijas, kurias turi ir MyISAM:

Funkcija
Prieinama MyISAM Variklyje?
Prieinama InnoDB Variklyje?
UžraktaiTaip, lentelių lygioTaip, įrašų lygio
Full-text PaieškaTaipTaip, nuo MySQL 5.6.4
Paskutinis Lentelės AtnaujinimasTaipTaip, nuo MySQL 5.7
Trikdžių AtkūrimasNeTaip
Indeksų Kardinalumas yra LentelėseTaipNe
MyISAM ir InnoDB Funkcijų Palyginimas

Bendra nuostata yra tokia – dirbdami su svarbiais duomenimis turėtumėte naudoti InnoDB. Dirbti su MyISAM yra sunkiau (pavyzdžiui, negalima tiesiog nukopijuoti MyISAM lentelių į MySQL serverį, tačiau naudodami InnoDB taip padaryti galite panaudoję užklausą ALTER TABLE ... IMPORT TABLESPACE;) ir vienintelis scenarijus, kada MyISAM yra greitesnė nei InnoDB yra tada, kai naudojamos COUNT(*) užklausos, nes MyISAM saugo įrašų skaičių lentelės metaduomenyse. Naudojant InnoDB tokios užklausos būtų lėtesnės, nes InnoDB neturi jokio išsaugoto įrašų skaičiaus – šiam varikliui reikia atlikti visos lentelės ar visų indeksų nuskaitymą.

Be to, jei naudosite InnoDB ir MyISAM, abiejų variklių veikimą optimizuoti bus sunku. Šioje lentelėje pateiktas galimų MyISAM parametrų sąrašas:

MyISAM Parametras
Apibūdinimas
key_buffer_sizeŠis parametras naudojamas tam, kad į cache būtų įrašomi MyISAM lentelių indeksų blokai.
read_buffer_sizeVisos lentelės nuskaitymui naudojamo buferio dydis MyISAM variklyje.
read_rnd_buffer_sizeĮrašai skaitomi per šį buferį tada, kai įrašai skaitomi rūšiuota tvarka atlikus rūšiavimo operacijas. Skaitant iš šio buferio išvengiama paieškų per diską – ORDER BY užklausos našumą galima pagerinti padidinant šio kintamojo vertę.
bulk_insert_buffer_sizeNaudojamas norint padidinti didelių duomenų kiekių importavimo greitį – šio buferio vertė nustatoma tada, kai aptinkamas didelių duomenų kiekių importavimas. Norėdami išjungti šį parametrą, nustatykite reikšmę 0.
myisam_sort_buffer_sizeŠio buferio vertė nustatoma tada, kai MyISAM varikliui reikia atsatyti indeksus. Naudojama tada, kai vykdomos užklausos REPAIR TABLE, OPTIMIZE TABLE, ALTER TABLE ir LOAD DATA INFILE. Skirstomas pagal vykdymo gijas.
myisam_max_sort_file_sizeMaksimalus laikinojo failo, kuris bus naudojamas atkuriant indeksus tada, kai vykdomos REPAIR TABLE, OPTIMIZE TABLE, ALTER TABLE ir LOAD DATA INFILE užklausos. Jei laikinojo failo dydis yra didesnis nei šio parametro vertė, indeksai bus sukurti naudojant raktų talpyklą.
myisam_repair_threadsJei lentelė turi daugiau nei vieną indeksą, MyISAM saugojimo variklis naudos nei vieną giją indeksams taisyti rūšiuodamas juos lygiagrečiai.
myisam_recoverLeidžia automatiškai taisyti ir atkurti MyISAM lenteles, kurios nebuvo tinkamai uždarytos.
Prieinamų MyISAM Parametrų Sąrašas

Kita vertus, jei dirbate su InnoDB, žvilgtelėkite į šiuos parametrus:

InnoDB Parametras
Apibūdinimas
innodb_data_file_pathNurodo failą, kuriame bus saugomi iš InnoDB lentelių gauti duomenys. Pagal nutylėjimą duomenys yra saugomi ibdata1 faile, kuris randamas /var/lib/mysql aplanke – ibdata1 yra vienas svarbiausių failų InnoDB infrastruktūroje.
innodb_buffer_pool_sizeAtminties buferis, kurį InnoDB naudoja tam, kad talpintų lentelių duomenis ir jų indeksus.
innodb_log_file_sizeInnoDB log failų dydis. Kuo didesnė ši vertė, tuo mažiau atkūrimo laiko reikės duomenų atstatymui.
innodb_log_buffer_sizeInnoDB naudoja šią vertę rašydama į log failus diske.
innodb_flush_log_at_trx_commitKontroliuoja pusiausvyrą tarp griežto ACID laikymosi vykdant operacijas ir didelio našumo. Pakeitus numatytąją šio parametro vertę gaunamas labai greitas įrašymo greitis, tačiau gali būti prarasta iki vienos sekundės operacijų ir atvirkščiai.
innodb_lock_wait_timeoutLaikas sekundėmis, kada InnoDB operacija laukia įrašų užrakto prieš pasiduodama.
innodb_flush_methodApibrėžia metodą, naudojamą duomenims į InnoDB duomenų failus ir log failus.
Prieinamų InnoDB Parametrų Sąrašas

Santrauka

Naudoti kelis duomenų saugojimo variklius tame pačiame MySQL serveryje nėra nieko blogo, tik turėtumėte nepamiršti, kad ir MyISAM ir InnoDB parametrai vaidina pagrindinį vaidmenį kiekvieno iš šių variklių veikime.

Jei planuojate naudoti abu variklius vienu metu, turėsite imtis aktyvių veiksmų, kad įsitikintumėte, jog MyISAM parametrai (key_buffer_size ir kt.) ir InnoDB parametrai (innodb_buffer_pool_size ir kt.) nesusiduria.

Vis dėlto, jei abiejų variklių maišymas nėra būtinas, tikriausiai turėtumėte pasirinkti InnoDB – kaip ir minėta ankščiau, darbas su MyISAM yra sunkokas, nes šiame variklyje yra naudojami lentelių lygio užraktai ir jame nėra gedimų atsatymo mechanizmų.

Leave a Reply

Your email address will not be published. Required fields are marked *