2011-06-09 4 views
1

J'utilise la requête suivante pour retourner tous les enregistrements en double avec les mêmes prénom et nom. L'astuce est que le contact_id, doit être dans l'ordre décroissant.Accélérer MySQL rejoindre pour vérifier les doublons

La requête renvoie les contacts comme prévu, mais c'est juste SO SLOW! Prend environ 6-8 secondes en vérifiant environ 30 000 enregistrements.

J'ai le contact_firstName, contact_lastName, contact_client_id et contact_id tous indexés dans la base de données.

Des idées que je pourrais faire pour essayer d'accélérer un peu? Merci pour votre aide :)

SELECT z.contact_id, z.contact_firstName, z.contact_lastName, RIGHT(z.contact_lastName,1) AS nameNum 
FROM (`contacts` x) 
JOIN `contacts` z ON `x`.`contact_firstName` = `z`.`contact_firstName` 
AND x.contact_lastName = z.contact_lastName 
AND x.contact_client_id = ".$ID." 
AND z.contact_client_id = ".$ID." 
WHERE `x`.`contact_id` < `z`.`contact_id` 
GROUP BY `z`.`contact_id` 
+2

Les accents graves! * Mes yeux! * –

+0

@djacobson: Pour ma part, je les apprécie. Ils peuvent rendre beaucoup plus facile de filtrer ce qui est un champ. –

+0

Reçu la réponse ici: http://stackoverflow.com/questions/11336246/mysql-min-group-by-on-large-tables-8000-rows –

Répondre

0
SELECT z.contact_id, z.contact_firstName, z.contact_lastName 
, RIGHT(z.contact_lastName,1) AS nameNum 
FROM `contacts` x 
JOIN `contacts` z ON (x.contact_client_id = z.contact_client_id) 
WHERE `x`.`contact_id` < `z`.`contact_id` 
And x.contact_client_id = '$id' 
GROUP BY `z`.`contact_id` 

Assurez-vous que vous avez un index sur:
- contact_id.
- contact_client_id

1

ne fait pas de promesses, mais voici une alternative à essayer:

SELECT c.contact_id, c.contact_firstName, c.contact_lastName, RIGHT(c.contact_lastName,1) AS nameNum 
    FROM (SELECT contact_firstName, contact_lastName, MIN(contact_id) AS MinID 
       FROM contacts 
       WHERE contact_client_id = ".$ID." 
       GROUP BY contact_firstName, contact_lastName 
       HAVING COUNT(*) > 1) t 
     INNER JOIN contacts c 
      ON t.contact_firstName = c.contact_firstName 
       AND t.contact_lastName = c.contact_lastName 
       AND c.contact_client_id = ".$ID." 
       AND t.MinID <> c.contact_id 
+0

C'était tout. Travaillé comme un charme. Merci Joe :) –