-1
votes

J'ai des données SQL 17949366 dans MySQL Workbench, j'essaie d'écrire une requête pour trouver des données en double.

SELECT id, survey_id
From Table1
Where survey_id IN(
  select survey_id
  from Table1
  Group By survey_id
  having count(id)>1
)
THIS IS MY QUERY BUT I HAVE BIG DATA I GUESS STILL FETCHING IN IT IN MYSQL WORKBENCH. ANY IDEA I CAN MAKE THIS PROCESS FASTER ?

4 commentaires

S'il vous plaît ne criez pas et voyez: Pourquoi devrais-je fournir un MCRE pour ce qui me semble être une requête SQL très simple? .


L'écriture dans tout le capital est considérée comme criant. Je suggère de le corriger. Vous pouvez également expliquer ce que cette requête est écrite?


Bienvenue, pour améliorer votre expérience, s'il vous plaît lire Comment demander , un Question de sujet , puis regardez le Liste de contrôle de la question , La question parfaite < / a>, comment créer un exemple minimal, complet et vérifiable et Prendre la tournée


Je suppose que vous voulez dire que vous avez 17 949 366 lignes dans votre table, dans MySQL, pas dans Workbench comme c'est juste un programme


4 Réponses :


0
votes
Select count(*),column from table group by column having count(column) > 1
You can simply group by directly. No need for sub query.
Try to add index for column 

1 commentaires

L'OP ne semble pas intéressé à retourner le compte.



0
votes

Vous pouvez regrouper vos données sans sous-requêtes:

SELECT id, GROUP_CONCAT(survey_id) as survey_ids
FROM Table1
GROUP BY id
HAVING COUNT(survey_id)>1;


2 commentaires

Merci exécution de votre requête, récupérer maintenant, Quick plus question Comment écrire la requête Supprimer la conduite en double? Ma requête choisissait Duplicata SAVOIR Comment je peux supprimer le duplicata?


Salut Denis j'ai eu un résultat différent avec votre requête que la mienne: /



0
votes

Parfois existe fonctionne mieux car il revient dès qu'il trouve la ligne: xxx

i suppose id est la clé primaire dans la table.


1 commentaires

Utilisez Expliquer pour voir le plan d'exécution de la requête. Le modèle de requête appelle ici un index approprié disponible.



0
votes

Utilisez Expliquer pour voir le plan d'exécution de la requête.

sur de grands ensembles, nous obtiendrons une meilleure performance lorsqu'un index peut être utilisé pour satisfaire un groupe, plutôt que d'une "utilisation de fichiers". Opération.

Personnellement, j'éviterais le dans (sous-requête) et utilisez plutôt une jointure à une table dérivée. Je ne sais pas que cela a un impact sur la performance ou dans quelles versions de MySQL peut y avoir une différence. Juste ma préférence personnelle d'écrire la requête de cette façon: xxx

Nous voulons un index qui a arond_id comme une colonne principale. Cela permet au groupe par d'être satisfait de l'index, évitant une opération potentiellement coûteuse "à l'aide de FilseTort". Le même index sera également utilisé pour la jointure à la table d'origine. xxx

Remarque: Si c'est INNODB et si ID est la clé de cluster , alors incluant la colonne n'utilise aucun espace supplémentaire (il applique une commande supplémentaire), mais plus important encore, il rend l'index A Index de recouvrement pour la requête extérieure (La requête peut être entièrement satisfaite à partir de l'index, sans rechercher de pages dans la table sous-jacente.)

avec cet indice défini, nous nous attendions à ce que le explique sortie supplémentaire de sortie " Utilisation d'index "pour la requête externe et omettez" à l'aide de FilserSort "pour la table dérivée (vue en ligne).


à nouveau, utilisez expliquer pour voir l'exécution de la requête plan.


2 commentaires

Et vous choisiriez ces méthodes sur une simple jointure (et distincte)?


@Strowberry: Oui. Je choisirais d'utiliser Expliquer pour voir le plan d'exécution. Je choisirais un modèle de requête qui utilise un index approprié. Je choisirais un motif de requête qui évite une opération coûteuse "à l'aide de FiltrySort". Je choisirais également ce modèle de requête pour l'affaire plus générale, au-delà de "au moins une autre rangée", par ex. Compte (S.ID)> 4 . Pour le cas particulier de > 1 , je choisirais le modèle de sous-requête existant (démontré par FORPAS) lorsque nous avons une garantie que ID est une clé primaire ou une clé unique, avec un index approprié disponible. Le motif de requête ici ne nécessite pas la clé primaire ID