flinke mysql database, scripts duren te lang.. tips?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

ik heb een tabel die continu aangevuld wordt met nieuwe data, daarnaast heb ik een tabel die totalen bijhoud (totaal nu 12.2miljoen records) (en nog een hoop andere gegevens) laten we ze voor het gemak even taarten noemen.

even een voorbeeldje van tabel: input_taart
appeltaart
bosbestaart
frambozetaart
appeltaart
slagroomtaart
appeltaart
etc.

tabel: main_taart(taart = uniek)
appeltaart 5
bosbestaat 1
frambozetaart 3
etc.

nu kijkt mijn script naar de tabel input_taart
- pak regel 1
- doe count in input_taart naar het woord in regel 1
- kijkt of de taart al voorkomt in tabel: main_taart
--- nee: insert taart 1
--- ja: tel taart_count op bij gevonde waarde en update die waarde
- delete from input_taart where taart='$regel1'
- regel 2, regel 3 etc.
(dit scriptje doet 80k regels in 10 minuten :S)

nu duurt bovenstaande nogal lang, en kan ik het veel korter maken als ik doe:
- pak regel 1
- kijkt of de taart al voorkomt in tabel: main_taart
--- nee: insert taart 1
--- ja: update waarde + 1
- regel 2, regel 3 etc
- truncate table input_taart
(dit scriptje doet 80k regels in ongeveer 60sec)

als ik mijn selectie voor het 2de scriptje maak, selecteer ik dus regels 1t/m80.000, aan het einde van het scriptje zijn die 80.000 regels al 90.000 regels geworden, als ik nu een truncate doe worden dus 90k regels verwijderd ipv 80k regels.

hoe kan ik dit het beste aanpakken?
opties:
- extra regel invoeren die een count doet op het geselecteerde aantal regels, en vervolgens een 'delete from input_taart LIMIT $regelcounter'
- nieuwe tabel maken, data verhuizen van input_taart naar temp_taart, en daarna truncate temp_taart
- anders? (ideeën zijn welkom)

Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
Dus je wilt de totalen van elke unieke waarde in input_taart ?? Zoek eens naar de functie DISTINCT, en leer die gebruiken

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:33

Dido

heforshe

fleppuhstein schreef op woensdag 13 mei 2009 @ 22:00:
Dus je wilt de totalen van elke unieke waarde in input_taart ?? Zoek eens naar de functie DISTINCT, en leer die gebruiken
Ik zou, gezien de totalen, eerder GROUP BY aanraden:
SQL:
1
select taart, count(*) from tabel group by taart


Maar ik heb zo'n vermoeden dat, met 10.000 records per minuut die worden toegevoegd, het probleem niet in een SQL query zit, maar in een high-performance oplossing om running totals bij te houden.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dido schreef op woensdag 13 mei 2009 @ 22:03:
[...]

Ik zou, gezien de totalen, eerder GROUP BY aanraden:
SQL:
1
select taart, count(*) from tabel group by taart


Maar ik heb zo'n vermoeden dat, met 10.000 records per minuut die worden toegevoegd, het probleem niet in een SQL query zit, maar in een high-performance oplossing om running totals bij te houden.
Ga ik even proberen, als ik regel voor regel verwerk en achteraf die truncate doe haal ik zOveeker 80k regels per minuut.. dus voorlopig zoek ik het nog even in mijn scripts ;) (hoop ik)

Overigens, van die 80k regels is ongeveer 65k (op dit moment) een update, en de rest nieuwe regels. ik verwacht over een maand ongeveer 95% updates te hebben. misschien moet ik de tabel niet te vaak willen aanvullen en wachten tot mijn input tabel wat voller is, dan heeft group by vast meer effect.

Thanks alvast, ik houd jullie wel op de hoogte