Recherche de doublon MySQL – Serveur mutualisé

02 08 12

Depuis un moment je suis face à un problème de " Query execution was interrupted ".

La requête en cause :

'SELECT DISTINCT * FROM contact T1 WHERE  EXISTS 
    	
    	(SELECT * FROM   contact T2 WHERE  T1.idcontact <> T2.idcontact 
    	
    								AND  T1.contactnom = T2.contactnom 
    									
    								AND  T1.contactprenom = T2.contactprenom 
    									
    								AND  T1.contactadresse = T2.contactadresse )'

Je fais ma requête sur environ 10 000 occurrences, après il y à cette requête qui fonctionne parfaitement d’après les différents retour.

ALTER IGNORE nom_de_la_table ADD UNIQUE INDEX(colonne1, colonne2);

Le soucis c’est qu’elle efface les données, je ne veux pas les effacer je veux les afficher. Je désespère en sachant que le soucis est un problème de configuration serveur, en local le temps d’attente est assez long je dirais environ 3 et 4min, sur mon serveur dédiée qui est déployé grâce à Nginx j’ai une belle erreur 504.

Ce qui me reste à faire c’est d’optimiser cette requête ou d’utiliser PHP. Faire les deux requêtes séparément, les stockés dans des array() et appeller array_diff() devrais le faire, je pense.

Export csv

Ce n’est pas tout je ne peux plus exporter le contenu de ma table en csv via une fonction PHP, ça me génère une belle erreur serveur. Cependant sur mon Kimsufi ça passe sans problème :shock:. Vous allez me dire qu’un mutualisé n’est pas fait pour ce genre de traitement ? Je commence à le croire aussi.

Continue la lecture, ces articles pouront peut être t'intéresser :

Veux-tu recevoir des astuces exclusives ? Laisse moi ton e-mail



Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Pseudo *

Please copy the string FUNE8r to the field below:

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  1. joffrey

    Il est possible que ton hébergeur (mutualisé?) tue les requêttes mettant plus de x secondes à s’éxecuter, d’ou le message d’erreur.

    La création de l’index unique ne lit que les colonnes colonne1 et colonne2, alors que tu copte les doublons avec un select *

    Si ta table contient des grosses colonnes, tu consomme énormément de temps cpu et de disque/mémoire dans la table temporaire.

    Tu peux essayer de le faire en plusieur passes
    1) CREATE TEMPORARY TABLE passe1 SELECT idcontact FROM contact t1 join contact t2 ON T1.contactnom = T2.contactnom
    1′) ALTER TABLE passe1 ADD KEY (idcontact)
    2) CREATE TEMPORARY TABLE passe2 SELECT idcontact FROM contact t1 JOIN contact t2 ON T1.contactprenom = T2.contactprenom JOIN passe1 USING (idcontact)
    2′) ALTER TABLE passe2 ADD KEY (idcontact)
    3) CREATE TEMPORARY TABLE passe3 SELECT idcontact FROM contact t1 JOIN contact t2 ON T1.contactadresse = T2.contactadresse JOIN passe2 USING (idcontact)
    3′) ALTER TABLE passe3 ADD KEY (idcontact)

    Et pour afficher :
    SELECT * FROM contact T1 join passe3 USING (idcontact)

    DROP TABLE IF EXISTS passe1 (passe2,passe3…)
    Hope it helps …

    Joffrey

    1. zourite

      Merci je vais voir ce que ça donne… 🙂

87% de mes meilleures astuces, conseils, formations et outils je les partages gratuitement par mail avec ma communauté. Productivité, automatisation, design, SEO et bien plus encore.

Je te propose de recevoir en premier lieu 21 outils incroyables qui pourraient changer ta vie.

Je ne partage pas tes informations avec des tiers.