» »

Large database

Large database

kunigunda ::

Soocam se s problemom velikega stevila rekordov. Bazo imam sicer mysql, v bazi je trenutno cez 16mio zapisov kjer se shranjujejo
eventi. Te rabim hraniti za 5 let. Vse sicer spila super, vendar hocem zaradi velike kolicine podatkov stare podatke
arhivirati v mesecne tabele, vendar ko na bazi 1mio rekordov naredim delete za dolocen mesec, mi nabije cpu do neskoncnosti
in produkcija ne more vec teci normalno. Ne myisam ne innodb ne delata kot bi morala. Studiram sicer o migraciji na postgres,
vendar to pomeni kup dela na aplikacijah. Ena resitev je da ze produkcija pise v mesecne tabele, kjer bo potem velikost cca 400k rekordov.
Tuki je spet problem, ker se v roku enega tedna posamezen event lahko poupdejta z dolocenimi podatki in moram potem iskati po mesecnih tabelah.
Ma kdo kako iskusnjo v tej smeri ? (oracle,mssql itd ne pride v postev)

technolog ::

Zakaj bi prestavljal v posebne tabele? Imej vse v isti tabeli... Če je vse lepo propper poindexano, ne bo problemov...

Recimo razlika selecta po intexanem polju je med 8.388.608 in 16.777.216 vrsticami samo 4,3% časa več. Vse zaradi binarnih dreves.

kunigunda ::

Select in insert ni panike, ko je treba brisati 200.000 rekordov za dolocen mesec, takrat so problemi, ker mora indexe brisati in potem se defragrmentirati
plac v index fajlih. Ko to dela, zaklepa bazo in posledicno ostali procesi ki selektirajo in insertirajo trajajo predolgo za real-time operacije.
Se poskusil tudi z delete quick in delete low_priority pa je dosti podobno. Nekje vem da sem cital, da ima mysql kar probleme ko enkrat naraste cez mio rekordov.

overlord_tm ::

Ne brises prek delete, ampak samo oznacis recorde kot brisane. Potem pa v nocnem casu (ko je nizek load) brises recorde, oznacene za brisanje.

zavajon ::

Ja, delete je "drag", ker mora skrbeti za redo loge in podobno...
Če moraš brisati večino podatkov je morda bolje, da recorde, katere ne želiš pobrisati, preneseš v začasno (ali drugo) tabelo, nato narediš TRUNCATE, nato shranjene podatke preneseš nazaj. Če pa nimaš constraintov ali kakšnih drugih ovir, enostavno dropneš originalno tabelo in preimenuješ tisto začasno.

kunigunda ::

To idejo sem imel ja, da original renejmam, skreiram novo, in v novo iz renejmane prepisem aktualne podatke, samo vmes laufajo inserti in bo potem luknja.
Kakorkoli ze, neke elegantne resitve pac ni :(

krho ::

Mysql 5.1? Potem table partitioning. Narediš particije..., skopiraš v prave particije.. na koncu narediš še truncate glavne tabele...
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

kunigunda ::

Bom pogledu Krho. Thx.

Lion29 ::

overlord ti je dal dober predlog

sicer pa je odvidno kako uporabljas stare arhive...

jaz bi recimo imel loceni tabeli med aktivnimi zapisi (tiste po katerih dejansko isces, popravljas in brises) in arhivnimi zapisi... ki jih samo kopicis in se ne spreminjajo ali brisejo.....seveda, ce se ti to splaca....

ce pravis, a imas za shranjevati 5 let podatkov, in da recimo aktivno delas s podatki v zadnjem letu, bi jaz za arhiv naredu tabelo tipa acrhive in nabil notri podatke... tiste aktivne podatke pa bi pravilno poindeksiral...

in seveda VSE operacije opravljal na TMP "kopiji" te tabele, kjer bi drzal notri le tista polja, ki jih potrebujes ...recimo ce dejansko uporabljas polja id, datum, naslov, status, bi vse ostale odstranil.... opravis potrebne manipulacije....in ko naredis vse selecte/edite etc... spremembe uredis na pravi tabeli

za brisanje pa uporabi spet pomozno tmp tabelo, kamor shranjujes IDje pobrisanih rekordov...seveda ce to ne pocnes s kakim drugim orodjem (PHPjem ali cem drugim... pol to naredi raje v kako array spremenljivko)
Founder and CTO @ Article-Factory.ai

krho ::

Problem pri Mysqlu je, da takoj, ko brišešš več kot 10% zapisov v tabeli ne uporabi indeksa ampak gre delat full table scan. DELETE FROM foo WHERE id IN (SELECT id FROM foo WHERE blalbla); pa ne dela. oz. vsaj ni delal nekje 2-3 leta nazaj, ko mi je uporaba mysqla pri sedaj imenovanem Openx požrl živce..
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

Lion29 ::

ma openx je tako krs izdelek, da je joj... fasada je kul, tudi prej bila...tehnicno je pa podn...

Problem pri Mysqlu je, da takoj, ko brišešš več kot 10% zapisov v tabeli ne uporabi indeksa ampak gre delat full table scan. DELETE FROM foo WHERE id IN (SELECT id FROM foo WHERE blalbla);


zato pa uporabis le index na id in naredis delete za vsakega posebej
DELETE FROM table WHERE id = 1;
DELETE FROM table WHERE id = 2;
DELETE FROM table WHERE id = 3;
DELETE FROM table WHERE id = 4;

etc...cim delas razlicne druge operacije na ogromnih tabelah pa to ne gre!

ze to se pozna
DELETE FROM table WHERE id < 5;


zato pa sem predlagal... vse manipulacije naj dela v TMP tabelah, kjer uporablja tiste res nujne fielde in pravilno poindeksirane... pa seveda je zlo pomemben tip fielda.... da ne uporabis int(16) za vrednosti od 1-10 ali text za polje z 1 znakom...


odvidno je tudi kolko spomina ima na razpolago... tmp tabelo lahko da komplet v spomin (memory storage engine) in z njo tam manipulira....
Founder and CTO @ Article-Factory.ai

Poldi112 ::

Čisto informatovno, a zna kdo povedati, kako bi se v takih primerih obnesel postgres?
Where all think alike, no one thinks very much.
Walter Lippmann, leta 1922, o predpogoju za demokracijo.

WarpedGone ::

Če prav razumem ti hraniš podatke o neki eventih, se pravi je trenutek nastanka vedno "sedaj", nikoli ne dobiš podatka za prihodnost.
Kaj ko bi mel za vsako leto svojo tabelo? Brisanje 5 let starih zapisov tako zgleda kot sprememba SQLa in drop tastare tabele.
Selecti ti pa ne češejo po eni tabeli ampak po 5ih sistemsko neodvisnih. Če maš dobre omejitve (po letu) lahko še dodatno omejiš iskanje.
Oracle temu pravi particioniranje ampak ga lahko precej simpl spelješ avtomatsko.

Če MySQW slučajno pozna koncept VIEWa, to postane še mal bol simpl.
Zbogom in hvala za vse ribe

technolog ::

Po moje slabše. Drugače pa lahko sprobaš.

Lion29 ::

Poldi112 je izjavil:

Čisto informatovno, a zna kdo povedati, kako bi se v takih primerih obnesel postgres?


ma za osnovne funkcije bi bil pr vlkih DBjih za odtenek hitrejsi...

sicer pa je mySQL kar se tice featurjev dokaj zmanjsal razliko in ponuja vse tisto kar je prej krasilo in razlikovalo postgres (stored procedures, views, transactions, etc)
Founder and CTO @ Article-Factory.ai

kunigunda ::

Hm, niti nism pomislu da bi za vsak id posebi delete delal. Zna bit to cist kul resitev, ker mi ni pomembno kolk cajta to dela. HW je kul, tko da pomoje 15min pa bo, itak mam primarni index na id. Bom stestiral sam mislim da bo slo.

@Warpedone, ze v mesecnih je cez mio rekordov, si ne upam pomislit kako bo po petih letih :P

krho ::

No če boš po enga in enega brisal jih obvezno zapakiraj v transakcijo. Čeprav sem še vedno mnenja, da se da to izredno lepo rešiti s particijami. Vse kar boš rabil popravljat je koda za izbris.. kjer narediš truncate najstarejše tabele. Sam bi naredil Tabele za 5*12mesecev... potem pa samo mesečno delaš truncate...
Kar se tiče selectov, jih delaš direktno na glavno tabelo, postgresql je tako pameten, da ve v katero tabelo mora iti delat select, upaj, da je enako z mysql.
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

Zgodovina sprememb…

  • spremenil: krho ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Učenje programiranja PHP

Oddelek: Programiranje
91497 (1038) Spura
»

sql

Oddelek: Programiranje
61020 (725) Miha 333
»

SQL inner join

Oddelek: Programiranje
393351 (2606) smacker
»

SQL vprasanje (strani: 1 2 )

Oddelek: Programiranje
688402 (5081) BivšiUser2
»

[C#] brisanje tabele, glede na ključ druge(mssql)

Oddelek: Programiranje
81177 (924) BlueRunner

Več podobnih tem