MySQL - što donosi nova verzija?

Iako se nova verzija (8.0) jednog od najpopularnijih relacijskih sustava za upravljanje bazom podataka u trenutku pisanja ovog teksta još uvijek nalazi u takozvanoj “release candidate” fazi razvoja, već sada je vidljivo da donosi brojne nadogradnje i unapređenja u odnosu na posljednju komercijalnu verziju 5.7. Prije nego se malo detaljnije pozabavimo njezinim karakteristikama, objasnimo, u svijetu softvera prilično neuobičajeni, skok u verzijama sofvera – sa 5.7 odmah na 8.0.

Prije nekoliko godina, u trenucima kad je Sun Microsystems preuzeo vlasništvo nad MySQL-om, intenzivno se radilo  na verziji 6 s najavom brojnih naprednih osobina, ali je nakon preuzimanja na neki način ta verzija stavljena “na led”. Zbog toga je nastavljen uobičajeni redovni rad na verzijama u 5.x liniji (trenutačna 5.7). Posebna verzija MySQL‑a, namijenjena za korištenje u velikim distribuiranim sustavima “MySQL NDB Cluster”, u međuvremenu je vođena kao serija 7, pa je zato zapravo prilično logično da prva “normalna” verzija MySQL-a s brojnim novim karakteristikama postane verzija 8.

Nakon objašnjenja zbrke oko oznake verzija, prijeđimo na pregled najvažnijih novosti verzije 8.

RJEČNIK PODATAKA

Jedna od najvažnijih novosti verzije 8 predstavlja dovršetak evolucije započete u verzijama 5.X. U prethodnoj generaciji baze podataka došlo je do zamjene podrazumijevanih sistemskih modula u najnižem sloju arhitekture MySQL-a (takozvanom MySQL Storage Engine). Umjesto godinama podrazumijevanog sustava MyISAM uveden je InnoDB s brojnim unapređenjima, od kojih svakako treba spomenuti podršku za transakcije.

Napomena: detaljniju usporedbu svojstava obaju navedenih sustava možete pronaći u videopredavanju autora ovog teksta pod nazivom "Optimiziranje MySQL baze i Laravela za rad s vrlo velikim bazama podataka".

Problem prethodnih verzija (generacija 5.X) bio je u tome što su transakcije uz pomoć InnoDB sustava bile podržane samo u dijelu SQL naredbi zaduženih za izmjenu podataka u tablicama. Ili, drugim riječima, samo u podskupu SQL naredbi iz grupe DML (Data Manipulation Language) naredbi. Sada je ista podrška uvedena i za grupu DDL (Data Definition Language) naredbi zaduženih za operacije nad objektima u bazi podataka (na primjer stvaranje i brisanje tablica, indeksa i slično). Kao posljedica navedenih promjena eventualni krah sustava više ne dovodi do problema s metapodacima, kao što je to bio slučaj ranije. U verziji 8 DDL naredbe se, baš kao i  DML naredbe, izvedu u potpunosti ili se uopće ne izvedu, pa je tako ovaj dio sustava također postao puno otporniji na eventualne probleme.

Uvođenje podrške za transakcije u radu s metapodacima omogućilo je stvaranje pravog rječnika podataka (Data Dictionary) u samom InnoDB sustavu. Time se izgubila potreba za korištenjem sistemskih tablica u obliku dodatnih fizičkih datoteka u datotečnom sustavu operativnog sustava za istu namjenu (na primjer, .FRM datoteke). Kao dodatni pozitivni efekt uvođenja novog tipa rječnika podataka u okviru InnoDB sustava, došlo je do porasta performansi, naročito kod vrlo velikih baza s velikim brojem tablica.

Da bi se dio sustava za praćenje stanja metapodataka (INFORMATION_SCHEMA) održao relevantnim tijekom izvođenja upita, više nije potrebno koristiti privremene tablice kao u prethodnim verzijama MySQL-a ni ažurirati njihovo stanje konzultiranjem velikog broja dodatnih .FRM datoteka ili podataka vraćenih iz Storage Engine modula.  Tablice INFORMATION_SCHEMA u verziji 8 jednostavno se definiraju kao pogledi (VIEW)  nad osnovnim tablicama u rječniku podataka. Razlika u djelovanju ovog dijela sustava između dviju generacija MySQL baza podataka prikazana je na sljedećoj slici.


Slika 1.  INFORMATION_SCHEMA u vezijama 5.7 i 8.0

Prethodna slika jasno pokazuje koliko je verzija 8.0 jednostavnija u izvođenju istih operacija, što (kao što je već ranije spomenuto) direktno povećava performanse rada i pouzdanost. Prema mjerenjima provedenim od strane samog proizvođača brzina dijela upita postavljenih na metapodatke u novoj verziji MySQL-a često se povećava čak do 100 puta!

U početnoj verziji 8.0 kao pogledi definirani su sljedeći dijelovi sustava:

  • SCHEMATA
  • TABLES
  • COLUMNS
  • VIEWS
  • CHARACTER_SETS
  • COLLATIONS
  • COLLATION_CHARACTER_SET_APPLICABILITY
  • STATISTICS
  • KEY_COLUMN_USAGE
  • TABLE_CONSTRAINTS.

U budućim 8.X verzijama planira se implementacija za:

  • EVENTS
  • TRIGGERS
  • ROUTINES
  • REFERENTIAL_CONSTRAINTS.

Dodatne krakteristike transakcijski orijentiranog riječnika podataka (iako svi dijelovi još uvijek nisu implemetirani u trenutačnoj verziji 8, ali su u planu), su:

  • dolaskom svake nove verzije MySQL-a jednostavnije ažuriranje postojećeg rječnika podataka u odnosu na isti postupak u verzijama 5.x
  • jednostavniji izvoz i uvoz podataka iz sistemskih tablica
  • drugačiji način pisanja i korištenja API funkcija prema novom rječniku podataka.

KORIŠTENJE ULOGA

MySQL u verziji 8 konačno dobiva standardnu implementaciju uloga (Roles) uobičajenu za moderne sustave za rad s bazama podataka. Korištenje uloga može bitno pojednostaviti administraciju složenih baza podataka s velikim brojem korisnika. Umjesto da se svakom korisniku pojedinačno dodjeljuju prava nad pojedinim objektima ili operacijama nad objektima u bazi podataka, prvo se može definirati nekoliko skupova prava (uloga), a onda se korisnici naknadno samorazvrstaju u odgovarajuće role, što je bitno jednostavnije. Mogućnost koju će svakako cijeniti administratori složenih sustava.

Slika 2.  Korištenje uloga

PROMJENE U PODACIMA

Verzija 8 trebala bi dodatno unaprijediti podršku za UTF8 kodiranje, kao dominatnog načina kodiranja na webu. Osim uvođenja podrške za više desetaka novih načina utf8mb4  kodiranja, krajnji cilj je da se u nekoj od verzija 8.x kao podrazumijevani način kodiranja konačno postavi utf8mb4_800_ci_ai.

Binarne operacije nad podacima sada su omogućene na većem broju tipova podataka nego ranije. U prethodnim verzijama takve operacije bile su podržane samo na tipu podatka BIGINT, a u verziji 8 podrška je proširena još na  [VAR]BINARY, [TINY|MEDIUM|LONG]BLOB. Kao direktna posljedica ove promjene pri izvođenju dijela binarnih operacija nad podacima u novopodržanim tipovima podataka više ne dolazi do gubitka podataka. Uz pomoć starih/novih SQL funkcija INET6_ATON(), INET6_NTOA(), UUID_TO_BIN(), BIN_TO_UUID() i IS_UUID() tako je omogućeno precizno rukovanje  IPv6 i  UUID (Universal Unique Identifier) podacima.

Kao dodatni korak prema punoj podršci za geografski orijentirane podatke uvedena je podrška za SRS (Spatial Reference System), što uključuje i rukovanje u rječniku podataka te drugim dijelovima MySQL sustava.

OPTIMIZACIJA PERFORMANSI

Osim već prije spomenutog poboljšanja performansi u radu s DDL podskupom SQL naredbi kao posljedice implementacije rječnika podataka u InnoDB sustav, brojne optimizacije izvođenja operacija uvedene su i u ostale dijelove sustava. Nabrojimo nekoliko najvažnijih.

Jedna od zanimljivih mogućnosti u radu s indeksima (kao temelja za svako brzo pretraživanje podataka u bazi podataka) je mogućnost njihovog proglašavanja "nevidljivim". Nevidljivi indeks se ne uzima u obzir kod pripreme plana izvođenja upita od strane optimizatora upita, ali je i dalje prisutan u bazi te se po potrebi može ponovo vratiti u vidljivo stanje. Na taj način se mnogo jednostavnije (brže) može testirati brzina izvođenja različitih planova izvođenja upita bez potrebe za stalnim uklanjanjem i vraćanjem indeksa. Tek kada (i ako) se utvrdi da neki indeks zaista nije potreban, može se napraviti njegovo trajno uklanjanje iz baze podataka.

Modul za analiziranje upita (parser) doživio je također brojne promjene u odnosu na prethodne verzije. To se prije svega odnosi na izvođenje DDL naredbi zbog drugačije "pozadine" njihove implementacije u verziji 8 u odnosu na prethodne verzije (opisano na početku teksta). Međutim, promjene u analizi upita nisu ograničene samo na taj dio, nego su iznova implementirani različiti dijelovi DML naredbi (npr. vrlo detaljne promjene u samoj naredbi SELECT).

Interni sustav za praćenje izvođenja upita (PERFORMANCE_SCHEMA) također je doživio poboljšanja za dodatno povećanje djelotvornosti. Na tablice iz ove strukture dodano je preko 100 novih indeksa, koji se po načinu djelovanja ponašaju kao hash‑indeksi, čime je maksimalno ubrzano pronalaženje točno traženih vrijednosti. U okviru ovog dijela sustava unaprijeđen je način pregleda grešaka kod izvođenja upita, koje se sada mogu pratiti kao globalni brojači grešaka na različitim razinama – na primjer na razini korisnika, niti izvođenja upita i slično. Ovisno o razini prava pojedinog korisnika navedeni brojači mogu se samo pregledavati od strane korisnika ili se može napraviti i njihova inicijalizacija (resetiranje).

Za stvaranje i praćenje različitih statističkih podataka o korištenju kolona tablica u upitima na koje nisu postavljeni indeksi, mogu se koristiti histogrami. Tako prikupljene podatke može kasnije koristiti optimizator upita za pronalaženje optimalnog plana izvođenja upita. Zbog fleksibilnosti spremanja i naknadne analize, predviđeni format spremanja podataka je JSON.

Slika 3.  Primjer korištenja histograma

Na primjer, prethodni primjer pokazuje da se za treći red u analizi 23,52 % upita izvodi ispod 75,86 mikrosekundi.

ZAKLJUČAK

Ovim člankom pregled ostalih "manjih" novosti u verziji 8 nije ni izbliza iscrpljen, ali se već na temelju opisanih dijelova može zaključiti kako će nova verzija nuditi znatno bolje performanse u radu te mnogo veću sigurnost u radu s metapodacima zbog transakcijske podrške dodane i za ovaj dio sustava. Sasvim dovoljno da se postojeći sustavi počnu seliti sa 5.x (ili starije) generacije MySQL baze podataka na 8.x.

Kategorija