» »

postgreSql/Mysql - počasen count

postgreSql/Mysql - počasen count

yimi ::

Ve kdo kako rešiti problem počasne count funkcije?

oba namreč delata sekvenčni scan čez celo tabelo, ker ne znata uporabiti indeksa (zaradi necommitanih transakcij, ker v indeksu sprememb še ni), kar pa je precej počasno ko se tabela poveča na nekaj 10 MB.

rokpok ::

Maš kakšen WHERE ali kaj podobnega v query-u?
Kaj pa če bi uporabil funkcijo mysql_num_rows (v PHP-ju), ki bo pogledala samo velikost array-a?
Rad bi bil pingvin.

Zgodovina sprememb…

  • spremenil: rokpok ()

darh ::

rokpok -- mysql_num_rows??? yimiju se gre za hitrost :)

kaj ti explain analyze napiše yimi?
Excuses are useless! Results are priceless!

yimi ::

ne, gre za preprost stavek. recimo:
explain select count(id) from t1;
"Aggregate (cost=31424.09..31424.09 rows=1 width=4)"
" -> Seq Scan on t1 (cost=0.00..30806.87 rows=246887 width=4)"

tudi branje ne pomaga, ker ne bere iz indeksao:
explain select id from t1;
"Seq Scan on t1 (cost=0.00..30806.87 rows=246887 width=4)"

če je id autonumber/serial lahko ponekod narediš takole (max() ne pride upoštev, ker ravnotako ne gre po indeksu kot count ali min...):
explain select id from t1 order by id DESC LIMIT 1;
"Limit (cost=0.00..0.13 rows=1 width=4)"
" -> Index Scan Backward using "primary" on t1 (cost=0.00..32000.76 rows=246887 width=4)"
super hitro a vendar deluje samo, dokler ne pričneš brisati iz tabele, torej tudi takšna rešitev ne pride v upoštev.

Zgodovina sprememb…

  • spremenilo: yimi ()

yimi ::

ena čisto nevmesna: rokpok, mysql_num_rows se je uporabljal 5 let nezaj, ko objektni pristop še ni bil tako prisoten kot sedaj. Kaj hočem povedati? Za povezavo z bazo pearova DB knjižnica ali pa Creole, katerega stabilno različico nestrpno pričakujem.

toliko let kot sta že prisotni ti dve bazi, pa jima nek osnovni count dela takšne težave, če je malo več podatkov.

Primoz ::

yimi ... v nobeni transakcijski bazi (razen v tistih z row locking metodo zagotavljanja transakcij) se ne da narest count(*) funkcije kot O(1). Povsod je O(n).

Če rabiš približno število, lahko vedno uporabiš statistike od db planerja. Ali pa imaš posebno tabelo ... pa se greš insert into ... values (1), potem pa select sum(vrednost); pa vsake toliko časa pobrišeš tabelo in pobrisane vrstice nadomestiš z vsoto. Če boš enostavno updateal števec ob vsaki spremembi bo stvar sploh neskončno počasna.

v myisam mysqlu je count(*) O(1) operacija ;)
There can be no real freedom without the freedom to fail.

yimi ::

ja, sem zbrskal da je iz myisam tabele count v konstantnem času...

tisto z tabelo je kar dobra ideja.
Kaj pa pravite na idejo, da narediš triiger afer insert, ki naredi update v neki lastni tabeli za statistiko: update moj_stat set rows=rows+1 where site='neki'...
da pa je sigurno točno pa en cron job, ki vsako noč prešteje

sicer pa večna dilema počasen postgre ali hitrejši mysql?

Bom kar namesto primoža dal naslednji post:
Seveda postgresql ker je bolj varen pa transakcije pa če štroma zmanka načeloma ne gre vse po gobe pa sladoled, pa discovery space shuttle, pa ...

in moj odgovor:
14 dni nazaj sem videl, da se tudi postgre sesuje in to tako, da nekaj tabel na vsem lepem ne dela več, pa ni potrebno da zmanjka elektrike


Vredno ogleda ...

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

[mySQL(+php)] Kako dobiti največji ID (številka) iz stolpca

Oddelek: Izdelava spletišč
91059 (938) preem
»

unset cookie

Oddelek: Izdelava spletišč
221776 (1583) tomitza
»

pgSQL problem z indexi...

Oddelek: Izdelava spletišč
71085 (995) Tito
»

Kaj je narobe tu...(php)

Oddelek: Programiranje
51128 (1026) teac
»

Rezanje teksta

Oddelek: Programiranje
9923 (832) darh

Več podobnih tem