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
irTEXT
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:
Užraktai | Taip, lentelių lygio | Taip, įrašų lygio |
Full-text Paieška | Taip | Taip, nuo MySQL 5.6.4 |
Paskutinis Lentelės Atnaujinimas | Taip | Taip, nuo MySQL 5.7 |
Trikdžių Atkūrimas | Ne | Taip |
Indeksų Kardinalumas yra Lentelėse | Taip | Ne |
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:
key_buffer_size | Šis parametras naudojamas tam, kad į cache būtų įrašomi MyISAM lentelių indeksų blokai. |
read_buffer_size | Visos 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_size | Naudojamas 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_size | Maksimalus 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_threads | Jei lentelė turi daugiau nei vieną indeksą, MyISAM saugojimo variklis naudos nei vieną giją indeksams taisyti rūšiuodamas juos lygiagrečiai. |
myisam_recover | Leidžia automatiškai taisyti ir atkurti MyISAM lenteles, kurios nebuvo tinkamai uždarytos. |
Kita vertus, jei dirbate su InnoDB, žvilgtelėkite į šiuos parametrus:
innodb_data_file_path | Nurodo 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_size | Atminties buferis, kurį InnoDB naudoja tam, kad talpintų lentelių duomenis ir jų indeksus. |
innodb_log_file_size | InnoDB log failų dydis. Kuo didesnė ši vertė, tuo mažiau atkūrimo laiko reikės duomenų atstatymui. |
innodb_log_buffer_size | InnoDB naudoja šią vertę rašydama į log failus diske. |
innodb_flush_log_at_trx_commit | Kontroliuoja 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_timeout | Laikas sekundėmis, kada InnoDB operacija laukia įrašų užrakto prieš pasiduodama. |
innodb_flush_method | Apibrėžia metodą, naudojamą duomenims į InnoDB duomenų failus ir log failus. |
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ų.