Gagnagrunnar: Kraftar nýttir betur Fjölmargir hafa kynnst gagnagrunnum við vefsmíði á s.l. árum. Það að smíða grunn er svolítið flókið til að byrja með en þegar INSERT, UPDATE og SELECT virkar í gegnum vefsíðurnar verða flestir ánægðir og láta sér þá þekkingu nægja, takmarkinu hefur jú verið náð. En það er fleira sem gott væri að huga að.

Þessi grein fjallar einmitt um það. Þú nýtir kannski ekki krafta SQL til fullnustu en þú getur alveg örugglega aukið afköstin verulega með tiltölulega einföldum aðgerðum.

Gagnagrunnar eru mismunandi, MySQL vinnur ekki alveg eins og SQL SERVER og enn síður eins og Access. Í þessari grein er gengið útfrá MySQL sem er algengur gagnagrunnur í vefvinnslu. Þó má nota flest atriðin fyrir alla aðra venslaða grunna.

Afkastaaukning getur verið um þúsund föld þótt áhrifin séu ekki alltaf sýnileg. Gagnagrunnar eru jú mjög hraðvirkir þrátt fyrir vitleysurnar sem við gerum. Þannig er það a.m.k. á meðan gagnagrunnarnir eru ekki mjög stórir eða álagið ekki mikið. Ef þú vinnur með þjóðskrá eða stórar log-skrár fara áhrifin ekki framhjá þér. Þetta er því vonandi góður lestur fyrir þig ef þú vilt temja þér góðar vinnureglur fyrir framtíðar verkefni.

Búnaðurinn í lagi
Hér verður auðvitað ekki gert upp á milli stýrikerfa eða gagnagrunna en það sem þú þarft að hafa er góð tölva, með góðum disk, örgjörva, stýrikerfi og gagnagrunni. Sérstaklega þarftu að passa þig á að hafa nóg minni því það hægir mjög mikið á allri vinnslu ef hún þarf að fara fram á diskinum. Að lokum þar sem um vefvinnslu er að ræða þarf tengingin út á netið auðvitað að vera góð. Allar tengingar svo sem ODBC o.þ.h. hægja á vinnslunni, því færri milliliðir því betra.

Töflualgebra
Nánar um töflualgebru hér.

Töflugerð
Veldu viðeigandi töflugerðir ef fleiri en ein eru í boði. Í MySQL geturðu t.d. valið um nokkrar töflugerðir. Venjulega töflugerðin er (MyISAM) hentar vel í flestum tilfellum en aðrar henta betur í ákveðnum verkefnum. Skoðaðu kosti og galla töflugerðanna og prófaðu þær.

Gögn og svið
Oft á tíðum eru töflur með óþarflega mörg og stór svið. Þau svið sem verða í töflunni ættirðu að reyna að hafa eins lítil og mögulegt er. Stærð röðunarlykils fylgir einnig stærð sviðsins sem hann tengist.

Svið sem skilgreint er sem unsigned int getur innihaldið tölu á bilinu 0 - 4.294.967.295 (þetta eru rúmlega 4 miljarðar) á meðan unsigned mediumint getur geymt tölu á bilinu 0 - 16.777.215 og unsigned smallint getur geymt tölu á bilinu 0 - 65.535 og unsigned tinyint geymir 0 -255. Í lang flestum tilfellum þarftu aðeins að nota unsigned tinyint eða smallint á svið. Hafðu í huga að sviðið tekur frá pláss á diskinum eins og það er skilgreint, hvort sem það er tómt eða ekki og stærð sviðs hefur áhrif á hraðann.

Tilgreindu að svið eigi að vera NOT NULL í þeim tilfellum sem það getur mögulega átt við. Það flýtir fyrir vinnslunni. Notaðu aðeins NULL ef þú þarft þess.

Varchar og blob skaltu aðeins nota í þeim tilfellum sem það á við. Hraðinn minnkar við að hafa breytanlega stærð sviða. Myndir ættirðu að geyma á server en ekki í gagnagrunni. Geymdu bara upplýsingar um myndina í gagnagrunninum.

Reyndu að hafa svið í þeirri röð sem þú notar þau. T.d. nafn, heimili, pnr en ekki í handahófskenndri röð.

Notaðu AUTO_INCREMENT á svið til að búa til einstök gildi í aðallykli.


SELECT skipunin
Oft er beðið um fleiri gögn en þörf er á. Allir kannast við að skrifa SELECT * FROM töflu þegar aðeins á að birta hluta sviðanna. Stjarnan er notuð því það er þægilegra að skrifa hana en að telja upp sviðin. Það fer óþarfa tími og minni í að sækja þessi svið sem kannski eru aldrei notuð. SELECT ætti því að nota til að sía eins mikið út og mögulegt er. Þetta er sérstaklega mikilvægt ef um er að ræða stóra töflu með mörgum sviðum svo ekki sé talað um stór textasvið.

Stundum rekst maður á eftirfarandi vinnubrögð. Ætlunin er er að birta nýjustu fréttina úr fréttatöflu.
SELECT fyrirsogn, frett FROM frettir ORDER BY id DESC;
Þarna eru allar fréttir sóttar þótt aðeins verði ein birt (sú síðasta).
Nota skal SELECT til að velja velja aðeins þá frétt sem ætlunin er að birta.
SELECT MAX(id) AS id, fyrirsogn, frett FROM frettir;
Hér var bara ein frétt (síðasta id) sótt.

Ekki raða gögnum í fyrirspurnum að óþörfu, sérstaklega ef röðunarlykill er ekki á þeim.
Sumir raða gögnum þótt þeir ætli bara að birta eina röð bara af vana. Það má auðvitað ekki!

Ekki nota flóknar SELECT skipanir á töflur sem eru uppfærðar oft. Það kemur í veg fyrir óþarflega langar töflulæsingar.

Hjálpartæki
Til eru ýmis hjálpartól skrifuð af fólki um allan heim. Mörg þeirra eru á lista undir Contributed software hjá MySQL hér. Það er um að gera að skoða úrvalið.
Sérstaklega mæli ég með svokölluðum “Benchmark” tólum til að finna flöskuhálsana í grunninum og fyrirspurnum.
Þetta eru mjög góð tól til þess að prófa mismunandi aðferðir og finna þá skilvirkustu.

Á ofangreindri síðu eru tól eins og super-smack, sem getur líkt eftir miklu álagi á kerfi og jafnvel látið það hrynja. Þannig er hægt að bæta og breyta og gera vefsvæði reiðubúið undir mikið álag. Mikið álag getur komið fyrirvaralaust á vefsvæðið þitt. Til dæmis ef vísað er í það úr frétt á mbl eða síðan verður síða dagsins á einhverri fjölsóttri síðu. Það væri grátlegt að væri að missa af öllum heimsóknunum því síðan lægi niðri vegna álags.

Hjálplegar skipanir í MySQL.
SHOW STATUS;
Mjög ítarlegur listi yfir ástand breyta gagnagrunnsins, einstakra taflna eða jafnvel einstakra aðgerða.

EXPLAIN;
Sýnir hvernig SELECT skipanir eru meðhöndlaðar og hjálpar okkur m.a. með að ákvarða röðunarlykla.

OPTIMIZE TABLE
Notaðu OPTIMIZE TABLE öðru hverju til að þjappa (defragment) og endurraða.

Senninha
himbrimi@yahoo.com