Tema: Re: Need nuomonės iš šono - DB
Autorius: Domas Mituzas
Data: 2011-12-09 20:31:28
> Aš suprantu, kad tikrai norima didesnės spartos, nes MyISAM jau stabdo.
> Vienas paspartėjimas beveik garantuotai nusimato, jei bukai pereiti prie
> InnoDB (čia jau į temą SERIALIZABLE ir/ar FOR UPDATE būdai, kas
> simuliuotų MyISAM veikimą). Ar galėtum suabejoti šiuo teiginiu, jį
> sukritikuoti, turint omenyje tą patį hw, InnoDB 1.1 (MySQL 5.5)?

A velnias žino, jeigu MyISAM variantas daro LOCK TABLE, tai analogiškas 
variantas bus toks pat blogas - nes laiko lock'ą interaktyviai (nebent 
SP tai daro, tada truputuką geriau ir InnoDB turi galimybę greičiau veikt).

Esmė ta, kad nei InnoDB nei MyISAM atveju konkurentiškumo tame nėra, tad 
čia optimizuojama neitin teisingoje vietoje.

> Kitas paspartinimo momentas/etapas, jau perėjus prie InnoDB, būtų
> konkurentiškumo įvedimas (Audrys būdas ar mano siūlytas, nors jis ir
> nėra optimalus), jei tik tai nėra griežtas FIFO.

Pagal originalią salygą tas metodas puikiai tinka, nes ten lenta 
atlockinama prieš pradedant darbą - tad panašu, kad nesvarbu, kad pats 
didelis eilės apdorojimo procesas būtų užbaigtas laiku, bile tik ID 
išduoti normalia eilės tvarka.

> Tai lock'o suteikimo tvarka ir nesiremiama; remiamasi tuo, kad lock'as
> jau suteiktas ir transakcijos persidengiančiai išsirikiuoja: T1, T2, T3,
> ..., Tn ir tam tikru momentu jos vyksta lygiagrečiai/konkurentiškai,
> todėl tikrasis/griežtasis FIFO principas pažeidžiamas jau ir šiuo
> aspektu, jei DBMS negarantuoja tokios pačios jų užbaigimo sekos. Juk
> negarantuoja? (aibė multi-core/multi-thread niuansų ir lygiagretaus
> vyksmo netolygumų).

DBMS garantuoja labai paprastus dalykus - izoliaciją tarp BEGIN ir 
COMMIT, visa kita (kaip to išsidėstymas laike, rūšiavimo tvarka, etc) 
jau yra šalutiniai implementacijų efektai.

DBMS garantuoja, kad BEGIN įvyko kažkur tarp to momento, kai klientas 
išsiuntė užklausą ir kai gavo atsakymą.

DBMS garantuoja, kad COMMIT įvyko kažkur tarp to momento, kai klientas 
išsiuntė užklausą ir kai gavo atsakymą.

DBMS negarantuoja, kad dviem klientam išsiuntus BEGIN'us, jie kažkokia 
ypatinga tvarka bus įvykdyti, kaip ir negarantuoja, kad anksčiau 
išsiųsta užklausa būtinai gaus lockus anksčiau.

Kai klientas kažko prašo, nėra jokių garantijų, tiktai atsakymas gali 
pasakyt kas iš tiesų įvyko. Klientas nežino ar yra kitų transakcijų, ir 
jeigu žinotų, negalėtų nieko padaryt (mes čia galvojam, ar apsimoka 
išmokyt varikliuką klausyt tokių komandų kaipo "join/copy snapshot of 
transaction X").

Tai va kai ant tokio rinkinio garantijų ar jų nebuvimo reik statyt 
eiliavimo platformas, tai nebėra taip trivialu, tad galima užtikrinti 
tik labai ribotą efektą ir su daug didesnėm kainom.

O kol kas su geru hardwaru galima daryt keletą tūkstančių eilės 
operacijų per sekundę ir plot katučių, kai su specializuota programine 
įranga galima išlupt ir šimtą tūkstančių operacijų su tom pačiom 
garantijom.

Domas