Door
Martijn K
op 25-11-2015 07:30
gewijzigd op 25-11-2015 07:31
2.484 views
Hallo,
Ik wil in een sql tabel records verwijderen die ouder zijn dan 7 dagen. Het script wat ik er voor heb gemaakt werkt op zich wel maar het gaat heel traag en het lijkt heel veel te vragen van de server. Volgens mij moet het veel makkelijker kunnen.
Hieronder de code die ik heb gemaakt:
<?php
$result = mysqli_query($dbCon,"SELECT
*
FROM
test");
if ($aantal_dagen>=7){
$ouderecords="DELETE FROM test WHERE ID='$id'";
if (!mysqli_query($dbCon,$ouderecords)) {
die('Error: ' . mysqli_error($dbCon));
mysqli_close($dbCon);
}
}
}
?>
Precies zoals hij het zegt.
Je moet je DELETE query aanpassen.
$query = mysqli_query("DELETE FROM `test` WHERE `tijd` <= hier je voorwaarde plaatsen");
Dit zou al voldoende zijn.
Probeer eerst eens een SELECT te doen op je database waar je in je query alleen de regels ophaalt die je wilt verwijderen. Dan kun je deze later omzetten naar een DELETE statement.
Mogelijk is een andere "optimalisatie" op zijn plaats, maar je vertelt niets over:
- het type data
- het gebruik
- de groei van de tabel over tijd
Je zegt "het gaat heel traag en het lijkt heel veel te vragen van de server". Waar blijkt dit uit en wat is de oorzaak daarvan? Dat is hetgene wat je zou moeten oplossen.
Dan gooi je de data ook echt weg. Weet je zeker dat je deze niet op een gegeven moment nodig hebt, bijvoorbeeld om statistieken te verzamelen ofzo? Je zou bijvoorbeeld kunnen overwegen om een extra kolom aan te maken ("deleted" of "active" ofzo) met een index hierop, zodat je enkel relevante/actieve data uit je tabel kunt selecteren als je deze nodig hebt. Maar goed, dit advies kan niet met goed fatsoen gegeven worden als je niets vertelt over de tabel...
Met het weggooien van data los je het probleem niet op, je gaat het enkel uit de weg, en daarmee gooi je (potentieel) een kind met het waswater weg.
@Jan
Zoals je in het voorbeeld kan zien zet MySQL de datum om naar een integer als je er een integer vanaf trekt.
Als je die dan gaat vergelijken met een datum zet MySQL ook die datum om naar een integer.
Dit kan onverwachte resultaten opleveren.
Het gaat over een tabel waarin gemaakte vragen staan van deelnemers aan een toets. Per dag worden er duizenden vragen gemaakt.
Ik denk dat het traag gaat omdat in Chrome de pagina blijft laden als ik het script oproep. Als ik een
echo "ok";
voor de laatste accolade in het script zet komt er ongeveer een "ok" per seconde in beeld. Daarnaast zie ik dat de records heel langzaam in aantal dalen.
Ik ben niet bang om de data echt weg te gooien want we gaan daar verder niets mee doen.
Ik ben nu nog wel aan het zoeken naar de juiste oplossing want ik weet nog niet hoe ik het script nu moet aanpassen. Ik dacht dat het iets eenvoudigs zou zijn.