Þegar unnið er með Ruby on Rails-rammagrefið vinnum við venjulega með tengdar gagnagrunnar eins og MySQL eða PostgreSQL. Þegar við skilgreinum flutninga með Active Record Migrations rekumst við á svokallaða vísitölu, en byrjendur skilja oft ekki alveg hvað vísitölur eru og hvaða ávinning þær bjóða.
Hér er tómt.
Þegar unnið er með Rúbín á Relsar rammaskipulag, við vinnum venjulega með tengdar gagnagrunna eins og Mýskúel eða PostgreSQL. Þegar við skilgreinum flutninga með Active Record Migrations rekumst við á svokallaða vísitölu, en byrjendur skilja oft ekki alveg vísitölu og hvaða ávinning hún býr yfir.
Í þessari færslu vil ég útskýra hvað vísitölur eru, hvað þær eru notaðar til og kynna nokkrar góðar aðferðir við notkun þeirra.
Gagnagrunnur
Það eru margir gagnagrunnsvélar, og einn vinsælasti þeirra er áður nefndur MySQL, PostgreSQL, Oracle eða Microsoft SQL Server. Þeir eru allir tengdir gagnagrunnar, sem þýðir að allir hlutar gögn Þær tengjast hver annarri og eru geymdar í töflum. Hver röð í töflu kallast skrá og hver skrá hefur sinn einstaka auðkennisnúmer (id). Þú getur skoðað röðun vinsælustu gagnagrunnsvéla á https://db-engines.com/en/ranking. Þar finnur þú einnig nokkra óreiknfræðilega gagnagrunna, svo sem MongoDB.
Að búa til vísitölu
Töflurnar í gagnagrunnunum okkar geta haft frá aðeins fáeinum upp í nokkrar tugir – í öfgafellum allt að nokkrum hundruðum – dálka. Mundu að hver tafla getur haft ótakmarkaðan fjölda raða. Þetta magn stafar ekki beinlínis af uppbyggingu gagnagrunnsins og við ættum alltaf að gera ráð fyrir að fjöldi skrána muni aukast stöðugt og að gagnagrunnurinn okkar muni því stækka. Upphaflegar forsendur og fyrirspurnir sem skrifaðar voru í núverandi forritum geta verið frábærar fyrir lítinn eða meðalstóran fjölda skrána, en með tímanum, þegar fleiri gögn berast, hættir forritið að eiga skilvirka samskipti við gagnagrunninn.
Hlutverk forritarans er að skrifa fyrirspurnir til að sækja gögn úr töflu eða töflum, en hagkvæmasta leiðin til að vinna úr fyrirspurninni fer eftir gagnagrunnsvélinni. Mundu að gagnagrunnsvélar hlaða gögn af diski í vinnsluminni og skanna þau síðan. Þetta þýðir að ef margir notendur framkvæma flóknar aðgerðir samtímis, munu sumir þeirra þurfa að bíða eftir sinni töku vegna skorts á úrræðum til að framkvæma leitir sínar. Þess vegna eru viðeigandi vísitölur svo mikilvægar.
Wiki: Vísitala – gagnasafn sem eykur hraða leitaraðgerða í töflu.
Fyrir hvern vísitölu þurfum við að skilgreina lykla (fyrir eina eða fleiri dálka) sem verða notaðir til að leita að færslum í töflunni. Gögnin í vísitölunni verða raðað með lykli sem áður hefur verið skilgreindur, sem mun verulega flýta fyrir leit að gögnum í töflunni. Einfaldasta dæmið úr daglegu lífi er símaskrá þar sem fólk er raðað eftir fornafni og eftirnafni. Má segja að vísitalan okkar í þessu tilfelli verði fornafnið og eftirnafnið.
Hvernig velur þú besta vísitölulykilinn? Það er ekki erfitt – mundu bara nokkur reglur. Búðu til vísitölu byggða á dálkum sem:
– verður oft notað í okkar fyrirspurnum (HVAÐA),
– í sameiningu gefa þau einstaka gildi (þ.e. gildi sem gefur til kynna nákvæmlega eina röð),
– verður notað sem svokallaðar tengingarstoðir (JOIN),
– gefa mest sértæku lykla, þ.e. þá sem skila fæstar línur þegar fyrirspurn er skrifuð.
Ef við vitum nú þegar hvaða lyklar verða hagkvæmastir fyrir töfluna okkar, getum við líka spurt okkur hversu mörg vísitöl við þurfum. Í þessu tilfelli er best að vita fyrirfram, á hönnunarstiginu, hvaða fyrirspurnir munu vísa til töflunnar okkar.
Búum til vísitölur fyrir tilteknar fyrirspurnir sem munu birtast, en skrifum þær ekki fyrir hvern dálk. Vísitölur, eins og töflur, þurfa að vera geymdar einhvers staðar, svo þegar við bjóum til töflur með vísitölu fyrir hvern dálk verðum við að hafa í huga að rýmið sem þær taka getur aukist verulega.
Búa til einstakan vísitölu
Annað mál sem við þurfum að hugsa um er einstæðni. Það borgar sig að eyða aukalegum fimm mínútum í að hugsa um hvort vísitalinn okkar sé í raun einstæður. Á þennan hátt segjum við fyrirspurnarbestjóranum að hann þurfi ekki að búast við afritum í fyrirspurninni. Til dæmis netföng:
frozenstringliteral: true
class CreateUsers < ActiveRecord::Migration[6.0]
def change
createtable :users do |t|
t.string :email, null: false
end
addindex :users, :email, unique: true
end
end
Á dæmi um PostgreSQL-vélina mun ég sýna muninn á hraða fyrirspurna í tölvupóstsreit með einstaka vísitölu og án vísitölu.
1. Þú getur notað sýnishorn kóði Brot úr gagnagrunninum þínum til að geta prófað dæmið hér að neðan. Fyrst skulum við búa til tómt tafla með einum dálki:
Búa til töflu notendur (
netfang varchar
);Hljóðskrift
2. Búum til 10.000 færslur fyrir prófið:
DO $
BEGIN FOR i IN 1..10000 LOOP
INSERT INTO users values((select 'user' || i || '@example.com'));
END LOOP; END;
$;HljóðskriftHljóðskrift
Við munum nota EXPLAIN ANALYZE til að athuga hversu hratt fyrirspurnin okkar verður afgreidd þegar við viljum finna ákveðinn notanda í gagnagrunninum.
Skýring á SELECT-fyrirspurninni: Skoða og greina SELECT-fyrirspurnina. SELECT email FROM users WHERE email = 'user890example.com';HljóðskriftHljóðskriftHljóðskrift
Fyrirspurn okkar neyddi til endurtekninga um alla töfluna í leit að þeim færslu sem vekur áhuga okkur.
Þessi aðferð kallast raðskönnun. Í þessu tilfelli er að lesa alla töfluna og sía út ákveðnar línur besta leiðin til að sinna verkinu.
PostgreSQL mun sía út óþarfa línur og einfaldlega skila þeim sem okkur skipta máli. Þetta er í raun besta lausnin í þessu tilfelli. Röðarskoðun er ekki alltaf slæm; það eru til tilfelli þar sem hún er kjörin.
4. Nú er kominn tími til að athuga fyrirspurnina sem þegar hefur verið gerð á töflunni sem inniheldur INDEX UNIQUE. Settu inn vísitöluna og keyrðu fyrirspurnina.
EATE UNIQUE INDEX index_email on users(email);
EXPLAIN ANALYZE SELECT email FROM users WHERE email = 'user890example.com';HljóðskriftHljóðskriftHljóðskriftHljóðskrift
Að þessu sinni nýtti PostgreSQL sér skönnun vísitölunnar vegna þess að allir nauðsynlegir dálkar eru þegar í vísitölunni.
Að velja aðeins nokkrar línur verður mjög skilvirkt þegar vísitalan er notuð. Hins vegar, ef fleiri gögn eru valin, mun skönnun á vísitölunni og töflunni taka of langan tíma.
Yfirlit
Eins og sjá má er framkvæmdatími fyrir fyrirspurn á reit með vísitölu mun styttri (í dæminu sem sýnt er er hann 0,111 ms en 1,267 ms, eða um 91,241 TP76T!). Mest mikilvæga munurinn er hvernig PostgreSQL leitar að þeim skrá sem okkur langar að finna. Í fyrsta tilvikinu þurfti gagnagrunnsvélin að leita í allri töflunni að þeirri skrá sem við þurftum. Í öðru tilvikinu er vísitölusniðið hins vegar raðað og einstakt, svo vélin vissi hvar skráin var staðsett, sem flýtti verulega fyrir vinnslutíma fyrirspurnarinnar.
Í tilvikum stórra gagnagrunnanna og mjög flókinna fyrirspurna geta rétt stilltir vísitölur verulega hraðað vinnu forritsins þíns án þess að þurfa að auka hraða vélarinnar sem leitar í gagnagrunninum.
Það er gott að muna að það er ekki góð venja að búa til vísitölur á hverja dálk. Vísitölur sem hafa verið búnar til flýta fyrir vinnu fínstillisins við leit að gögnum sem vekja áhuga, en hægja á við innslátt nýrra gagna og uppfærslu þeirra sem fyrir eru.