Vra

Ek het 'n groot databasis van genormaliseer einde data wat steeds baie stadig om navraag vir verslagdoening. Baie van die navrae wat ek gebruik in verslae aan te sluit vyf of ses tafels en is om te ondersoek tiene of honderde duisende lyne.

Daar is baie van die navrae en mees gewees soveel as moontlik gemaak om te server load verminder en die verhoging van spoed. Ek dink dit is tyd om te begin hou 'n afskrif van die data in 'n denormalized formaat.

Enige idees oor 'n benadering? Moet ek begin met 'n paar van my ergste navrae en gaan van daar af?

Was dit nuttig?

Oplossing

Ek is meer oor MSSQL dat mysql weet, maar ek dink nie die aantal aansluit of aantal rye jy praat moet jy veroorsaak te veel probleme met die korrekte indekse in plek. Het jy al die navraag plan ontleed om te sien of jy mis enige?

http://dev.mysql.com/doc/refman/ 5.0 / af / explain.html

Dit gesê, as jy is satisifed met jou indekse en het alle ander moontlikhede uitgeput is, kan de-normalisering die regte antwoord wees. As jy net een of twee vrae wat probleme is, 'n handleiding benadering is waarskynlik toepaslik, terwyl 'n soort van datapakhuise instrument beter vir die skep van 'n platform om data blokkies ontwikkel kan word.

Hier is 'n site wat ek gevind dat raak oor die onderwerp:

http: //www.meansandends. com / mysql-data-pakhuis /? link_body% 2Fbody =% 7Bincl% 3AAggregation% 7D

Hier is 'n eenvoudige tegniek wat jy kan gebruik om denormalizing navrae eenvoudig te hou, as jy net besig met 'n paar op 'n slag (en ek is nie die vervanging van jou OLTP tafels, net die skep van 'n nuwe een vir verslagdoeleindes). Kom ons sê jy het hierdie navraag in jou aansoek:

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

Jy kan 'n denormalized tafel te skep en vul met byna dieselfde navraag:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

Let op die onderstreping ooreenstem met die tafel aliasse wat jy gebruik

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

Toe aan jou program op te los om die nuwe denormalized tafel gebruik, skakel die kolletjies vir onderstreping.

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

Vir groot navrae kan dit 'n baie tyd spaar en maak dit duidelik waar die data vandaan kom, en jy kan hergebruik die navrae wat jy reeds het.

Onthou, ek dit net pleit as die laaste uitweg. Ek is seker daar is 'n paar indekse wat jy sal help. En wanneer jy de-normaliseer, moenie vergeet om rekenskap te gee vir die ekstra ruimte op jou skywe, en uit te vind wanneer jy die soektog sal loop om die nuwe tafels te vul. Dit moet waarskynlik in die nag, of wanneer aktiwiteit is laag. En die data in daardie tafel, natuurlik, sal nooit presies op hoogte te wees.

[Nog 'n wysig] Moenie vergeet dat die nuwe tafels wat jy maak moet ook geïndekseer! Die goeie deel is dat jy die indeks om die inhoud van jou hart en nie kan bekommerd wees oor update slot twis, aangesien opsy, weg van jou grootmaat voeg die tafel sal net kies sien.

Ander wenke

MySQL 5 doen ondersteun uitsig , wat mag nuttig in hierdie scenario wees. Dit klink asof jy reeds 'n baie optimalisering gedoen het, maar as jy nie kan MySQL se VERDUIDELIK sintaksis om te sien wat indekse is eintlik gebruik word en wat stadiger jou navrae.

Sover gaan oor normaliseer data (of jy nou met behulp van menings of net duplisering data in 'n meer doeltreffende manier), ek dink wat begin met die stadigste navrae en werk jou pad deur 'n goeie benadering te neem.

Ek weet dit is 'n bietjie oppervlakkig, maar Het jy al probeer sien as daar meer indekse wat jy kan byvoeg?

Ek het nie 'n baie DB agtergrond, maar ek werk met databasisse baie onlangs, en ek het bevind dat 'n groot deel van die navrae net verbeter kan word deur die byvoeging van indekse.

Ons gebruik DB2, en daar is 'n opdrag genoem db2expln en db2advis, sal die eerste aandui of tafel skanderings vs indeks skanderings gebruik word, en die tweede sal indekse wat jy kan byvoeg om prestasie te verbeter beveel. Ek is seker MySQL het soortgelyke gereedskap ...

In elk geval, as dit is iets wat jy nog nie oorweeg word, is dit is te help baie met my ... maar as jy reeds hierdie roete gegaan het, dan dink ek dit is nie wat jy is op soek na.

'n Ander moontlikheid is 'n "bewaarheid view" (of soos hulle dit noem in DB2), waarmee jy 'n tafel wat in wese is gebou van dele uit verskeie tafels spesifiseer. Dus, eerder as om te normaliseer die werklike kolomme, jy kan hierdie siening om toegang tot die data te voorsien ... maar ek weet nie of dit het ernstige prestasie impak op insetsels / updates / vee uit (maar as dit is "bewaarheid", dan is dit moet help met kies sedert die waardes fisies apart gestoor word).

In lyn met 'n paar van die ander kommentaar, ek sou beslis 'n blik op jou kruip.

Een ding wat ek ontdek het vroeër vanjaar op ons MySQL databasisse was die krag van saamgestelde indekse. Byvoorbeeld, as jy rapporteer op bestelling getalle oor periodes, 'n saamgestelde indeks op die bestelnommer en orde datum kolomme kan help. Ek glo MySQL kan net een indeks te gebruik vir die soektog so as jy net moes aparte indekse op die bestelnommer en orde datum dit sou hê om te besluit op net een van hulle om te gebruik. Met behulp van die opdrag VERDUIDELIK kan help om te bepaal hierdie.

Om 'n aanduiding van die prestasie met 'n goeie indekse (insluitend talle saamgestelde indekse) gee, kan ek navrae by 3 tafels in ons databasis hardloop en kry amper onmiddellik resultate in die meeste gevalle. Vir meer komplekse verslagdoening meeste van die navrae uit te voer in minder as 10 sekondes. Hierdie 3 tafels het 33 miljoen, 110 miljoen en 140 miljoen rye onderskeidelik. Let daarop dat ons ook reeds genormaliseer hierdie effens te bespoedig ons mees algemene navraag op die databasis.

Meer inligting oor jou tafels en die tipes verslagdoening navrae kan verdere voorstelle toelaat.

Vir MySQL Ek hou van hierdie praatjie: Real World Web: Performance & Scalability, MySQL Edition . Dit bevat 'n baie verskillende stukke van die raad vir die kry meer spoed uit MySQL.

Jy kan ook te oorweeg die keuse van 'n tydelike tabel en die verrigting van navrae op daardie tydelike tafel. Dit sou verhoed dat die behoefte om jou tafels te eindig vir elke enkele navraag aan u uitreik (die veronderstelling dat jy die tydelike tabel kan gebruik vir talle navrae, natuurlik). Dit gee basies jou data denormalized, maar as jy net doen kies oproepe, daar is geen kommer oor konsekwentheid data.

Na aanleiding van my vorige antwoord, 'n ander benadering wat ons in sommige gevalle geneem is om die sleutel verslagdoening data in 'n aparte opsomming tafels te stoor. Daar is sekere verslagdoening navrae wat net gaan stadig wees, selfs nadat denormalising en optimalisatie en ons het bevind dat die skep van 'n tafel en die stoor van die bestuur totale of opsomming inligting regdeur die maand as dit kom in gemaak aan die einde van maand verslag doen baie vinniger as well.

Ons het gevind dat hierdie benadering maklik om te implementeer as dit nie iets wat reeds besig was het breek - dit is net bykomende databasis insetsels by sekere punte

.

Ek het al speel met saamgestelde indekse en het 'n paar werklike voordele gesien ... miskien sal ek die opstel van 'n paar toetse om te sien of dit my here..at minste kan spaar vir 'n bietjie langer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top