2010-12-09 4 views
5

J'essaie d'obtenir le nombre d'enquêtes qui doivent être prises qui est stocké dans seotc, et le nombre de sondages complétés, stockés seotcresults_v2. La table seotc contient près de 100 000 enregistrements et la table seotcresults_v2 contient environ la moitié de ce nombre. Comment puis-je accélérer cette requête?Accélérer cette déclaration MySQL

SELECT 
    DISTINCT seotcresults_v2.Clock, 
    COUNT(seotc.Id) AS Surveys, 
    COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock 
WHERE seotcresults_v2.CampusID = 40 
AND seotcresults_v2.Term = 201011 
ORDER BY seotc.Clock 

MISE À JOUR:

Merci pour toutes les réponses. La structure de la table (au minimum) est la suivante:

seotc: | Id | Horloge | CampusID | Terme

seotcresults_v2: | Id | Horloge | CampusID | Terme Q1 | Q2 | ... etc

Id est l'indice auto-incrémentée dans chaque tableau pour les enquêtes et les résultats du sondage

Clock 'est un identifiant pour un instructeur et peut être trouvé à plusieurs reprises dans le tableau seotc et seotcresults_v2 car ils ont plusieurs classes et plusieurs enquêtes complétées pour chaque classe pour plusieurs termes. Essentiellement, j'essaie de déterminer le taux de réponse en fonction du nombre de sondages pour un instructeur dans un campus donné dans un terme donné par rapport au nombre de résultats affichés pour ces mêmes paramètres. Est ce que ça aide?

Je vais tenter d'exécuter le EXPLAIN aussi rapidement.

+1

Vous voudrez peut-être ajouter la structure de la table à votre question. –

+0

Quels index avez-vous définis sur ces tables? –

+1

Veuillez également exécuter EXPLAIN sur la requête et collez la sortie. –

Répondre

4

Premières choses à vérifier: les colonnes clause WHERE sont-elles indexées?

Alors: avez-vous besoin de l'ORDER BY, qui est un tri, et coûteux.

Enfin, les colonnes .clock sont-elles indexées?

+0

Que voulez-vous dire par indexé? Comme dans, "Sont-ils dans leur propre table avec un Id auto-incrémenté approprié?" Si telle est la question, alors non, ils ne le sont pas, mais le CampusID est unique. C'est ce que tu veux dire? Je ne suis pas un DBA et ce que j'ai appris a été autodidacte. J'aimerais apprendre ceci si vous avez la patience de me diriger dans la bonne direction. – d2burke

+0

Un ID auto-incrémenté (séquence, identité, quel-que-votre-db-appelle-it) n'est pas un index - il s'agit simplement d'un champ d'identifiant unique à incrémentation automatique sur chaque ligne. Un index est une entité distincte de la table; là où la table contient les données, un index contient seulement les champs clés (souvent hachés) et un pointeur dans la table où les données associées à cette clé peuvent être trouvées. Typiquement, les champs d'identité (séquence, numéro automatique, etc.) ont un index créé automatiquement, ce qui renforce l'unicité. –

+0

Cependant, le SGBDR ne créera pas automatiquement d'index pour les autres champs - vous devez le faire vous-même. En règle générale, tout champ que vous spécifiez dans une clause WHERE, ORDER/GROUP BY ou JOIN peut être un candidat pour avoir un index. Sans un index, le SGBDR doit souvent faire une «analyse de table» de la table entière chaque fois qu'il doit comparer deux champs, ou une valeur à un champ, et cela prend beaucoup de temps (de plus en plus à mesure que la table se développe) . Un index permet au RDBMS de «raccourcir» un balayage de table en ayant une liste ordonnée de clés (ou de valeurs) à analyser et à comparer, ce qui est beaucoup plus rapide. –

0

Je ne pense pas que cette requête va même vous donner des résultats corrects.

Ajouter un index à campusID et Term, et éventuellement horloge. Ensuite, essayez cette requête:

SELECT seotcresults_v2.Clock, 
     COUNT(seotc.Id) AS Surveys, 
     COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock 
WHERE seotcresults_v2.CampusID = 40 
AND seotcresults_v2.Term = 201011 
GROUP by seotcresults_v2.Clock 
ORDER BY seotcresults_v2.Clock