2011-03-13 5 views
1

Comment optimiser ces requêtes MySQL accédant à deux tables de plus de 10 millions de lignes chacune?Accéder aux tables MySQL avec plus de 10 millions de lignes = Erreur: trop de connexions

Ce que fait la requête ci-dessous, c'est qu'elle récupère tous les identifiants de la table 'users' qui n'existe pas dans la table 'guests'. Cela retournera plus de centaines de milliers de lignes, donc nous limitons cela à au moins 5000 ID par exécution. Y a-t-il une meilleure façon d'exécuter ceci afin que nous puissions en faire plus par course. Après avoir identifié les ID qui n'existent pas dans la table des invités, nous devons supprimer ces lignes dans la table des utilisateurs. Cela signifie donc qu'il exécutera 5000 autres requêtes de suppression pour supprimer tous ces ID. Si nous exécutons ce processus avec deux tables contenant plus de 10 millions de lignes de données, notre serveur renvoie une erreur indiquant qu'il a trop de connexions et que le serveur MySQL n'est plus accessible tant que vous ne le redémarrez pas. Mais si nous exécutons le même processus avec les deux tables contenant plus de quelques milliers de lignes, il ne rencontre pas ce problème, mais cela prend encore un certain temps. Pourquoi cela se produit-il et comment pouvons-nous éviter cela tout en optimisant ce processus?

Répondre

1

2 choses - vérifiez comment votre logiciel gère les connexions MySQL. On dirait qu'il ouvre une connexion persistante, puis ne la réutilise pas, et il y a une nouvelle connexion avant chaque requête. Deuxièmement, vous pouvez modifier votre requête en une seule instruction, au lieu d'exécuter une requête distincte pour chaque utilisateur. De cette façon, une seule connexion est nécessaire, et tout le traitement sera du côté MySQL, ce qui permettra de l'optimiser davantage. Editer: Une autre chose que vous pouvez vérifier est d'exécuter EXPLAIN sur votre requête pour vous assurer que vous avez tout l'index approprié (si la partie sélectionnée est lente maintenant).

+0

Il n'utilise pas de connexion persistante. Ce qui me tracasse, c'est que dans la liste des processus pour MySQL, il y a beaucoup de requêtes SELECT après ma requête SQL principale publiée ci-dessus. Ces requêtes select sélectionnent les ID dans la table des invités. Est-ce que LEFT JOIN ou une instruction JOIN fait une requête de sous-sélection? Est-il possible que LEFT JOIN provoque l'erreur "too many connection"? – officeboi101

+0

@officeboi - non, ce ne serait pas possible. Quel logiciel/langage/bibliothèque utilisez-vous pour cela? Il se peut que votre bibliothèque récupère des informations supplémentaires via des sélections séparées ... Et il se peut que la même bibliothèque provoque des connexions supplémentaires ... – Sergey

0

Avertissement: Testez cette requête avant d'exécuter des données en direct. Je ne prétends pas être tenu responsable des données perdues

DELETE 
    u 
FROM 
    users AS u 
LEFT JOIN 
    guests AS g 
ON g.id = u.id 
WHERE 
    g.id IS NULL 
    AND (users.in >= '$before' AND users.in <= '$now') 

Quant au cœur de votre question (trop de connexions) Je soupçonnez que votre script PHP commence de nouvelles connexions en boucle pour jamais ID qui doit être supprimé.

+0

J'ai créé un simple script de test PHP juste pour obtenir les ID dans la table utilisateur qui ne le fait pas n'existent pas dans la table d'invités. C'est normal - Connectez-vous en utilisant une connexion normale (non persistante), puis sélectionnez SELECT en utilisant la requête SQL ci-dessus puis déconnectez la connexion et utilisez PHP pour afficher le résultat. Je rencontre toujours le même problème, il me donne l'erreur "Too many connections". J'ai même limité le résultat à 2500 et c'est toujours pareil. De même, personne ne peut accéder à la base de données MySQL pendant l'exécution du script. Est-il possible que l'instruction JOIN effectue une sous-sélection entraînant une erreur de connexion trop importante? – officeboi101

+0

Non. Une requête s'exécute dans une connexion. Il ne crée pas de connexions supplémentaires pour les sous-requêtes, etc. – Mchl

Questions connexes