A voir ce qui est le plus optimisé selon la taille de tes tables, mais tu as plusieurs moyens d'optimiser :
- si tes tables sont petites,
DELETE FROM `table1` WHERE `id_data` NOT IN (SELECT value FROM `table2`) ?
- pour tes tables plus grosses et, surtout, si tu souhaites garder un traitement côté PHP - pour ajouter des logs, un contrôle, etc -, faire du traitement par lots avec des requêtes préparées (
introduction à PDO et
requêtes préparées).
Cette méthode te permettra de traiter des lots de 50 (par exemple, à adapter selon ton serveur et ta bdd) éléments avec des requêtes pour lesquelles le moteur aura déjà calculé le plan d'exécution => gain de temps
Tu peux aussi récupérer tous tes identifiants à supprimer dans un tableau et lancer ta requête de suppression à la sortie de ta boucle (plutôt que de faire un
DELETE à chaque tour de boucle).
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<?php
$tabToDelete = array();
$sql = "SELECT id_data FROM `table1`";
$req = mysql_query($sql);
while ($arr = mysql_fetch_array($req, MYSQL_ASSOC))
{
$ide = " SELECT `name` FROM `table2` WHERE `value`='".$arr['id_data']."'";
$result = mysql_query($ide);
$arr2 = mysql_fetch_array($result, MYSQL_ASSOC);
if (!$arr2){
$tabToDelete[] = $arr['id_data'];
}
}
if (!empty($tabToDelete))
{
$reqdel = "DELETE FROM `table1` WHERE `id_data` IN '".implode(',', $tabToDelete)."'";
mysql_query($reqdel);
}
?> |
Partager