[RESOLU] DELETE WHERE avec près de 10.000.000 lignes...

Avatar du membre
Mammouth du PHP | 1564 Messages

03 mars 2015, 20:11

Bonjour,

j'arrive pas à faire quelque chose de simple et rapide avec delete mysql, il me faut supprimer des champs qui sont supérieur ou égale à une année voulue et que le mois soit supérieur ou également à celui voulue, j'arrive à un max execution time au bout de 10mn, je n'y arrive.

Donc, pour commencer, je fait d'abord un while avec un select:

Code : Tout sélectionner

SELECT MAX(id) AS ids,id_membre,MAX(jour) AS jour,MAX(mois) AS mois,MAX(annee) AS annee FROM stats GROUP BY id_membre
les résultats sont de forme suivante:

#31274822# idm: 1 => 3-3-2015 intervale à supprimer: 01-02-2015
#31274806# idm: 2 => 3-3-2015 intervale à supprimer: 01-02-2015
#31274827# idm: 3 => 3-3-2015 intervale à supprimer: 01-02-2015
...

on à #id# de la stats dans la base (le MAX(id))
idm: id du membre
=> date de la dernière stat
Intervale à supprimer me calcul "date de la dernière stat" - 30 jours

Je souhaite ensuite faire un delete (dans le while), comme ceci:

Code : Tout sélectionner

mysql_query("DELETE FROM stats WHERE id_membre=".$in['id_membre']." AND mois<=".$MoisIntervalle." AND annee<=".$AnneeIntervalle);
Merci d'avance pour votre aide

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2015, 18:07

Ta récupération de date n'est pas correcte.
Le MAX() te renverra le nombre max des enregistrements sans corrélation entre eux hormis le fait que c'est sur le même utilisateur.

Si tu as cela en base :
3-3-2015
31-2-2011
Ta requête renverra 31-3-2015.

Du coup ce que tu souhaites c'est plutôt le max de la date concaténée (je ne sais pas si l'expression se fait par contre en SQL).
Bref c'est un poil plus compliqué pour pouvoir obtenir la date correcte avant de retrancher 30 jours.

Pour le temps d'exécution sur un nombre aussi important de ligne vu le calcul que tu dois mettre en place je ne trouve pas cela dérangeant à vrai dire...

Mammouth du PHP | 2278 Messages

04 mars 2015, 18:50

Moi je dirais qu'il serait more simple d'avboir un champ date ou datetime dans la base.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Mammouth du PHP | 1564 Messages

04 mars 2015, 22:57

Moi je dirais qu'il serait more simple d'avboir un champ date ou datetime dans la base.
Merci pour vos réponses, j'avais en effet prévue ce champs que je viens de voir à l'instant ! :mrgreen:
Sujet résolu !