Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2012, 12h05   #1
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
Par défaut Supprimer ligne si pas dans autre table

Bonjour,
alors je sait, cette question, est classique.
Moi je faisais toujours :

Code :
DELETE FROM matable WHERE `champs` NOT IN (SELECT id FROM autre_table)
très bien, sauf que ce coup-ci, la table correspondant à 'autre_table` est gigantesque, ce qui provoque un timeout ...

J'ai essayer avec un LIMIT dans la sous requête, mais MySQL n'accepte pas les LIMIT dans les sous-requête de type IN ...

Alors comment pourrais-je faire svp ?
Merci d'avance.
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 13h33   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Essaie avec une jointure :
Code :
1
2
3
4
DELETE a
FROM matable a 
LEFT OUTER JOIN autre_table b ON b.id = a.une_colonne -- et pas champ !
WHERE b.id IS NULL
Et pour accélérer les choses, indexer a.une_colonne. Vu son nom, je suppose que b.id est clé primaire, donc indexée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 14h12   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
Bonjour,

Avant de poser une question, merci de consulter la : http://mysql.developpez.com/faq/?pag..._data_sans_ref
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h19   #4
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
désolé, j'ai oublié de dire que j'avais aussi essayé, désolé

Je montre quand même code et erreur :

Code :
1
2
3
4
SELECT COUNT(m1.id)
FROM memory_card m1
LEFT JOIN memory_j_mod_card m2 ON m1.id = m2.card
WHERE m2.card IS NULL
erreur :

#1317 - Query execution was interrupted

ça arrive au bout de 7 sec. environ ...
merci.

EDIT

oups, désolé pour le code, j'ai fait un SELECT COUNT() au lieu d'un DELETE juste pour m'assurer que je n'en supprime pas trop, mais ça fait pareil avec un DELETE :

Code :
1
2
3
4
DELETE m1
FROM memory_card m1
LEFT JOIN memory_j_mod_card m2 ON m1.id = m2.card
WHERE m2.card IS NULL
(donne le même résultat).
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h26   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
bonjour,


Avez-vous un index sur memory_j_mod_card.card et un autre sur memory_card.id ?

Ensuite, quand vous aurez ces 2 indexes retestez votre requête actuelle et une en passant par un not exists (je ne sais pas si MySql interprete les 2 requetes de la même facon):
Code :
1
2
3
4
 
SELECT COUNT(m1.id)
FROM memory_card m1
WHERE NOT EXISTS (SELECT 1 FROM memory_j_mod_card m2 WHERE m1.id = m2.card)
Pis 7 sec de timeout c'est pas beaucoup ...
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h30   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Combien de lignes dans les tables ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 17h48   #7
Membre confirmé
 
Homme Dominique
Première S
Inscription : juillet 2010
Messages : 252
Détails du profil
Informations personnelles :
Nom : Homme Dominique
Âge : 15
Localisation : France

Informations professionnelles :
Activité : Première S

Informations forums :
Inscription : juillet 2010
Messages : 252
Points : 228
Points : 228
Désolé, la table memory_j_mod_card a un primary key sur les colonnes 'card' et 'mod' ensemble (ce sont les seules colonnes), et la table memory_card a bien une colonne ID en primary key.


Citation:
Avez-vous un index sur memory_j_mod_card.card
Je ne peu pas mettre un index sur la colonne card, mais il y en a un sur les champs 'card' et 'mod'.

Et désolé, ça ne marche toujours pas.
Au passage l'erreur survient après environ 9 à 15 sec. (variable apparemment).

Pour le nombre de ligne :

memory_card -> 78 000
memory_j_mod_card -> 90 000

et ce n'est rien par rapport à ce qu'il y aura plus tard
D'ailleurs, c'est pas encore énorme ...

merci.
Dominique49 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h15.


 
 
 
 
Partenaires

Hébergement Web