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
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:
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
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/
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!
Verwijderd
Dus mij lijkt TRUNCATEN, XML naar CSV omzetten en dan LOAD DATA INFILE de meest performante oplossing
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.

100 mb aan xml

[ Voor 14% gewijzigd door SchizoDuckie op 24-04-2008 20:54 ]
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?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)

Verwijderd
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.
En klaar ben je al, met de minst mogelijke (nouja vrij weinig in elk geval) I/O.
Siditamentis astuentis pactum.
Verwijderd
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...
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.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.
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.
Verwijderd
Verwijderd
.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)..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.
En ja, wanneer er dan iets mis gaat is een transactie de beste manier om je DB niet om zeep te helpen.
[ 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.
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..