Modérateur PHPfrance |
2575 Messages
12 mai 2009, 12:37
Déjà pour optimiser on peut modifier la requête:
En la récrivant comme ça:
Code : Tout sélectionner
DELETE FROM tablea WHERE id_email IN (SELECT DISTINCT id_email FROM tableb)
Pour utiliser id_email qui est un index numérique au lieu du champ "email" qui est un texte, on gagne du temps quant à la recherche effectuée par WHERE et IN, car la recherche d'un index numérique est plus rapide que celle d'un index de type texte.
Et on peut ajouter une limite pour le nombre de suppression, mais le mot LIMIT doit être à la fin de la commande DELETE:
Code : Tout sélectionner
DELETE FROM tablea WHERE id_email IN (SELECT DISTINCT id_email FROM tableb) LIMIT 20
Ici, seules 20 suppressions max sont autorisées.
En suite, on peut abandonner l'opérateur IN qui oblige la requête de chercher dans un ensemble. Ce qui oblige le moteur de requête à construire d'abord l'ensemble (SELECT ....) avant de faire la recherche IN.
Pour cela, on remplace IN par une jointure naturelle (relation) : JOIN entre les 2 tables, ce qui donne la requête suivante:
Code : Tout sélectionner
DELETE A.* FROM tablea A JOIN tableb B ON A.id_email = B.id_email
La spécification de
A.* dans la commande DELETE est obligatoire dans notre cas car elle désigne la table où sera effectuée la suppression puisque dans le FROM on utilise au moins 2 tables liées A et B.
Remarque: Dans cette solution de jointure, le DELETE ne supporte pas le mot LIMIT dans une requête multi-tables.
--------
//////----
//---
//----
//////
-------
//---
//----
//---
//----
//---
//
------
//////----
//////-----
//////
-----
||--------
||--
||---
||
Prendre le recul n'est pas une perte de temps.
ps:
Affrontez moi dans l'arène