PHP mysql, wat is sneller?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Goedemiddag,

Wat is sneller? Ik moet een database elke nacht up to date houden adhv XML feeds, die soms 100 MB per stuk kunnen zijn.

Wat is dan sneller? Elke nacht de DB legen met DELETE FROM blaat? En dan de XML doorlopen en alles INSERTen.
Of de XML doorlopen en elke rij SELECT doen om te zien of hij al bestaat, zo niet, INSERT, zo wel, skip?

Kon hier niet echt iets over vinden.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Geen idee, ik denk TRUCATE icm met INSERT.

TRUNCATE maakt de tabel in een keer leeg, in plaats van alle regels te verwijderen.
Dus dan hoef je alleen nog maar in te schieten.

Tip: zet je indices uit en indexeer je tabellen pas als je alles erin hebt geschoten. :)

Edit:
Je zegt SELECT en dan INSERT, daarvoor heb je:
MySQL:
1
2
INSERT INTO <tabel> SET <vars>
ON DUPLICATE KEY UPDATE <vars>;

[ Voor 23% gewijzigd door Gonadan op 24-04-2008 09:46 . Reden: foutje, en spuit11 blijkt nu :+ ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Maak een testcase en probeer het uit :). In plaats van een select te doen om te kijken of een row bestaat kun je ook gebruiken maken van on duplicate key.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:04
wat denk je zelf ?

Het een kan je misschien -ik weet niet in hoeverre MySQL kan 'praten' met xml (cfr OPENXML in MSSQL) - een setbased operatie zijn, het andere niet ....

Je kan ook eens gek doen, en het uittesten / benchmarken ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Je kan ook REPLACE INTO gebruiken als een alternatief voor DELETE, INSERT. Toch is het waarschijnlijk inderdaad sneller als je eerst alles weggooit en dan weer opnieuw inleest.

Het is misschien ook de moeite waard om die Xml om te zetten naar een CSV bestand en dan met LOAD DATA INFILE in 1 keer in te lezen. Scheelt weer een paar honderd duizend queries.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 15-09 21:32
Wat vaak ook sneller werkt bij het importeren van grotere hoeveelheden data is eerst de indexen uitschakelen/verwijderen en na het importeren weer inschakelen/aanmaken.

Acties:
  • 0 Henk 'm!

Verwijderd

Als je een paar duizen rijen moet importeren is LOAD DATA INFILE de beste oplossing, ik heb er onlangs nog een snelheidswinst van meer dan 250% mee gehaald ten opzichte van gegroupte INSERT queries.

Dus mij lijkt TRUNCATEN, XML naar CSV omzetten en dan LOAD DATA INFILE de meest performante oplossing

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoals altijd: meten is weten

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

developers die applicaties produceren die 100mb aan xml uitspugen moeten eigenlijk publiekelijk aan de schandpaal genageld worden :X Kijk voor je eigen safety even op memory efficient xml parsers die niet het hele 100mb aan xml in 1x in je server memory proberen te dumpen maar stukje voor stukje inlezen. Ik denk dat database efficientie de minste van je te verwachten problemen is :P

100 mb aan xml 8)7 wát staat daar in godesnaam in?

[ Voor 14% gewijzigd door SchizoDuckie op 24-04-2008 20:54 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
100MB aan xml is niets, en zelfs een getal waarbij het niet een zo bijster veel uitmaakt of je een hele boom bouwt of dat je een SAX-parser gebruikt... een goede boom zal niet veel meer dan die 100MB aan geheugen trekken.

En grote xml files? enwiki heeft aan page history 2TB... aan bz2'ed xml, dus da's 40TB plain text. Ok, de 2TB-dump is niet te downloaden, maar de 6.4GB-dump eronder (die alleen de huidige tekst bevat) is ook, ehm, groot.

(nlwiki is 'slechts' 6GB bz2'ed... nog een hoop ;))

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

ValHallASW schreef op donderdag 24 april 2008 @ 21:35:
100MB aan xml is niets, en zelfs een getal waarbij het niet een zo bijster veel uitmaakt of je een hele boom bouwt of dat je een SAX-parser gebruikt... een goede boom zal niet veel meer dan die 100MB aan geheugen trekken.

En grote xml files? enwiki heeft aan page history 2TB... aan bz2'ed xml, dus da's 40TB plain text. Ok, de 2TB-dump is niet te downloaden, maar de 6.4GB-dump eronder (die alleen de huidige tekst bevat) is ook, ehm, groot.

(nlwiki is 'slechts' 6GB bz2'ed... nog een hoop ;))
Da's leuk en aardig allemaal als je een dedicated webserer tot je beschikking hebt, maar ik blijf van mening dat XML noooit bedoeld is om 100mb groot te worden (weet je hoeveel a4'tjes aan tekst dat zijn? 8)7 en de gemiddelde PHP installatie krijgt normaal gesproken 8MB geheugen toegewezen op een virtual host. Knappe jongen die daar 100mb data in in weet te lezen.

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Waarom verwacht je dat iemand die dagelijks XML files van 100 MB krijgt iets aan het doen is op een virtual hostingaccountje? :)

Acties:
  • 0 Henk 'm!

Verwijderd

En dan nog, wanneer de XML redelijk plat is (en XML representaties van een tabel zijn dat) kun je met een SAX parser prima 100MB verwerken met 8MB geheugenruimte.

Bij een DOM parser moet je eerst de hele XML laden voordat 'ie 't kan verwerken, maar bij SAX kun je node voor node parsen en verwerken terwijl de stream binnenkomt. Klein nadeeltje is wel dat je misschien al een aantal flink records in je database gezet hebt en dan blijkt dat de XML niet valid is, maar dat is met transacties op te lossen.

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Ik zou doen: verzamel de sleutels uit de XML, verzamel de sleutels uit je DB. Deze twee lijstjes ga je beide sorteren. Dan loop je ze beide van boven naar beneden door, en vergelijkt de verschillen. Soms ontbreekt een getalletje in de lijst van je DB --> Record invoegen. Soms ontbreekt een getalletje in de lijst van de XML --> record uit de DB wegmikken.

En klaar ben je al, met de minst mogelijke (nouja vrij weinig in elk geval) I/O.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

Variejana, je houdt dan geen rekening met het feit dat bestaande records misschien ook gewijzigd kunnen zijn.
Maar met 'record wegmikken' heb je wel een punt, daar hebben de REPLACE INTO mensen hierboven geen rekening mee gehouden. ;)

Ik zou in dit geval gaan voor een truncate en daarna alle records opnieuw inserten, en dan gewoon door zelf de XML data te parsen. LOAD DATA INFILE is opzich wel sneller, maar als je feed XML is moet je die toch nog zelf omzetten naar CSV. En of je zelf alle inserts doet of die inserts overlaat aan LOAD DATA INFILE? Geen idee of 't de moeite waard is van die extra conversieslag, maar zoals .oisyn al ze, meten is weten...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op donderdag 24 april 2008 @ 22:34:
En dan nog, wanneer de XML redelijk plat is (en XML representaties van een tabel zijn dat) kun je met een SAX parser prima 100MB verwerken met 8MB geheugenruimte.

Bij een DOM parser moet je eerst de hele XML laden voordat 'ie 't kan verwerken, maar bij SAX kun je node voor node parsen en verwerken terwijl de stream binnenkomt. Klein nadeeltje is wel dat je misschien al een aantal flink records in je database gezet hebt en dan blijkt dat de XML niet valid is, maar dat is met transacties op te lossen.
Transacties gebruiken om te bailen als de XML niet valide lijkt? Dat lijkt me een beetje overkill. Valideer 'm dan eerst, kun je er daarna zeker van zijn dat je data volledig in de db te zetten is. Dan hog je de db server ook niet meteen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Kan je niet de nieuwe en de oude xml "diff"en zodat je alleen een verschil xml overhoud en die inspoelt?

Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op donderdag 24 april 2008 @ 23:18:
Transacties gebruiken om te bailen als de XML niet valide lijkt? Dat lijkt me een beetje overkill. Valideer 'm dan eerst, kun je er daarna zeker van zijn dat je data volledig in de db te zetten is. Dan hog je de db server ook niet meteen.
.oisyn, met een SAX parser kun je de XML niet van tevoren valideren. Bij het verwerken van de nodes heb je 'm namelijk nog niet helemaal binnen. Dat is aan de ene kant het voordeel van SAX (je kunt direct de binnenkomende gegevens verwerken), en aan de andere kant z'n nadeel (als er wat mis is heb je al dingen verwerkt).
En ja, wanneer er dan iets mis gaat is een transactie de beste manier om je DB niet om zeep te helpen. :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt 'm wél van tevoren valideren, en daarna nóg een keer over de file heen te gaan om 'm in te voeren. En als je de XML van een andere source dan van disk (zoals via het netwerk) binnenkrijgt, dan kun je 'm eerst opslaan (wat dan sowieso wel handig is)

[ Voor 42% gewijzigd door .oisyn op 25-04-2008 00:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt de XML via SAX toch omzetten naar een CSV bestand? En mocht op een gegeven moment blijken dat de XML niet geldig is, dan verwijder je gewoon het import csv bestand.

Dergelijke bestanden inlezen als DOM tree is niet verstandig, want nu is het bestand misschien 100MB, maar over 18 maanden kan dat natuurlijk gemakkelijk zijn gegroeid naar 250MB.

If it isn't broken, fix it until it is..

Pagina: 1