2010-08-18 5 views
0

J'ai une base de données mysql dans laquelle une seule table a 7 millions d'enregistrements, la table doit être optimisée, je suis un peu hésitant à ajouter l'index car cela va prendre beaucoup de temps 7 millions d'enregistrements. Je continue d'obtenir cette requête dans le journal de requête lente, le long de la requête est écrit de manière optimiste.Les données du tableau ont augmenté - la requête est lente

Quelle est la meilleure approche pour gérer cela afin que la requête de table ne se présente pas en requête lente?

+0

Convenu ... quels types de requêtes prennent apparemment pour toujours (très lent) qui sont vos plus grandes préoccupations ... Beaucoup de gens pourraient être ici capable d'aider d'une manière que vous n'auriez pas envisagée pour d'autres techniques d'optimisation – DRapp

+0

Supprimer de où column1 dans (sélectionnez column1 from ); Supposons que la table1 possède 7 millions d'enregistrements avec une clé de primay. La table 2 a des index appropriés avec 50K enregistrements. – Sharpeye500

Répondre

0

Supprimer de table1 où colonne1 dans (sélectionnez la colonne1 de table2); n'est pas optimal.

Essayez

delete table1 t1 
from table1 t1 
inner join table2 t2 on t2.column1 = t1.column1 
where conditions=true; 

Je crois qu'il devrait mieux performer

+0

Merci, pourquoi utilisons-nous deux fois la table t1 dans la même requête? – Sharpeye500

+0

Vérifiez la syntaxe de plusieurs tables à partir d'ici: http://dev.mysql.com/doc/refman/5.0/fr/delete.html – ceteras

0

Sans votre code, il n'y a pas d'aide définitive. L'indexation est la voie à suivre, et cela prendra un peu de temps, mais ce n'est qu'une seule fois. Cela ajoute des frais supplémentaires à vos insertions, mais c'est le prix à payer pour améliorer l'efficacité des requêtes.

0

Vous devez créer un index. Pas vraiment. Peut-être même plus d'un.

Les requêtes sur 7 millions de lignes sans un index va être lent. Vous pouvez diviser la table ou allouer une grande quantité de mémoire pour la mise en cache, mais les index vous donnent beaucoup plus pour le dollar.

Vous pouvez demander, quel (s) index (s) devriez-vous créer? Bonne question. Cela dépend des requêtes spécifiques que vous exécutez sur la table. La conception de table est déterminée par vos données, mais l'optimisation est déterminée par vos requêtes.

Apprenez à utiliser EXPLAIN. Voir Explain Demystified.

Apprenez comment fonctionnent les index. Voir More Mastering the Art of Indexing


Re votre commentaire: Oui, une clé primaire a implicitement un index (au moins en MySQL), mais je ne sais pas si la requête dont vous avez besoin pour améliorer les prestations de cet indice.

Voici un conseil: lorsque je veux expérimenter avec des index sur une très grande table, je crée une table de copie à partir d'un sous-ensemble de lignes. Mettez un nombre non trivial de lignes dans la table, mais assez peu pour travailler dessus ne prendra pas trop de temps.

Maintenant, vous pouvez créer et supprimer des index et tester les requêtes pour voir leur performance. Une fois que vous avez identifié l'index ou les index qui vous donnent le plus d'avantages, vous pouvez avoir plus de confiance que leur création sur votre base de données réelle en vaut la peine.

+0

J'ai une clé primaire, la raison pour laquelle j'hésite à ajouter un autre index est qu'elle va verrouiller la table et cela vaut la peine de le faire ou nous pouvons le faire par tout autre moyen qui n'affectera pas/produira le temps d'attente. – Sharpeye500